数组中的数独求解算法

时间:2016-01-10 11:45:54

标签: c++ algorithm sudoku

我最近学过C ++,而且我正试图设计一个Sudoku - Solving算法。我开发了这个算法但是当我运行程序时,计算机从我那里获取输入值但是然后没有给出任何输出。任何帮助将不胜感激。

请告诉我程序是否过于冗长而无法执行,如何改进。

#include <iostream>
#include <math.h>
using namespace std;

int main() {
    int a[9][9], r[9][9][9], pv[9][9], super[9][9], i, j, k, ij, tv, m, n, g1, g2, g, c, power, p, argh;
{
    cout<<"PROGRAM TO SOLVE A 9 X 9 SUDOKU: "<<endl<<endl<<"Enter sudoku matrix columnwise with rowwise entries in each column: "<<endl;
    for (i=0, j=0, ij = 0 ; (i<9)&&(j<9) ; i=(i<8)?i++:0, j=ij/9, ij++) {
        cin>>a[i][j];
        while ((a[i][j]<0)||(a[i][j]>9)) {
            cout<<"wrong input for c["<<i+1<<"] and r["<<j+1<<"]"<<endl<<"Enter again: ";
            cin>>a[i][j];
        }
    }
}
for (i=0, j=0, ij=0 ; (i<9)&&(j<9) ; i=(i<8)?i++:0, j=ij/9, ij++) {
    if (a[i][j]==0) {
        for (k=0 ; k<9 ; k++) {
            r[i][j][k]=k+1;
        }
    }
    else {
        for (k=0 ; k<9 ; k++) {
            r[i][j][k]=a[i][j];
        }
    }
}
for (c=1, tv = 1 ; ; c++) {
    for (i=0, j=0, ij = 0; ij<80 ; i=(i<8)?i+1:0, j = ij/9, ij++) {
        argh = i + 9*j;
        super[i][j]=9^argh;
        pv[i][j] = (c/super[i][j])%9;
        for (m=0 ; m<9 ; m=(m==i)?m+2:m+1) {
                tv = tv && (r[m][j][(pv[m][j])]!=r[i][j][(pv[i][j])]);
        }
        for (n=0 ; n<9 ; n=(n==j)?(n+2):(n+1)) {
                tv = tv && (r[m][j][(pv[m][j])]!=r[i][j][(pv[i][j])]);
        }
        for (g1=0, g2=0, g=0 ; (g1<8) ; g++, g1=g%3, g2=g/3) {
                tv = tv && (r[3*(i/3)+g1][3*(j/3)+g2][(pv[3*(i/3)+g1][3*(j/3)+g2])]!=r[i][j][(pv[i][j])]);
        }
    }
    if (tv==1) {
        for (i=0, j=0, ij=0 ; ij<80 ; ij++, i=ij%9, j=ij/9) {
            cout<<a[i][j]<<" ";
            if (i=8*i/8) {
                cout<<endl;
            }
        }
    }
    else {
        cout<<"sudoku can not be solved exactly: ";
    }
    return 0;
  }
}

1 个答案:

答案 0 :(得分:0)

老实说,我甚至没有尝试理解你的代码(你应该在源代码中评论一些最不起眼的部分),但我注意到了一些问题。

例如,第一个循环(所有这些,真的),不是更简单吗?

for ( i = 0; i < 9; ++i ) {
    for ( j = 0; j < 9; ++j ) {
        cin >> a[i][j];
        // ... check the input ...
    }
}

你想用所有i=(i<8)?i++:0, j=ij/9, ij++部分完成什么?

我已经评论的最后一个“循环”由于其范围内的return 0;而仅执行一次。可能这不是你的目的,但另一方面,正如许多人指出的那样,如果你像你一样写下它

for (c=1, tv = 1 ; ; c++) { ... }

它将无限期地继续,因为没有结束条件。

导致程序冻结的原因(至少其中一个问题)是,我相信,它内部有一个循环(子方检查,在行和列之后,我猜):

for (g1=0, g2=0, g=0 ; (g1<8) ; g++, g1=g%3, g2=g/3) { ... }

条件g1 < 8始终为真,因为您更新了它:g1 = g % 3

也许还有其他问题,但很抱歉,我无法弄清楚你想做什么(以及如何做)。