我最近学过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;
}
}
答案 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
。
也许还有其他问题,但很抱歉,我无法弄清楚你想做什么(以及如何做)。