我想制作一个解决3 * 3数独谜题的程序。我已经制定了一个程序,但它仅适用于50%的问题,其余的则提供了60%的正确解决方案。我不知道如何针对每个可能的问题以有限的步骤解决它。我使用的技术是我正在搜索数组的每个单独元素并检查在同一行和列中哪些不存在然后我将它放在该单元中并移动到下一个。但这不是每个问题的解决方案。我想到的下一件事是我们应该为一个单元编写每个可能的数字,然后继续。但是我们如何决定我们最终应该将哪个数字放入单位。我只想知道如何编写适用于每个问题的解决方案。我希望你明白这一点。 我写的代码是
#include<iostream>
using namespace std;
int rowsearch(int l[9][9],int row,int num) // function to search a particular number from a row of array
{
int counter=0;
for (int c=0 ; c<9 ; c++)
{
if (l[row][c]==num)
counter=counter+1;
}
if (counter>0)
return 1;
else
return 0;
}
int colsearch(int l[9][9],int col,int num) // function to search a number from a column of an array
{
int counter=0;
for (int c=0 ; c<9 ; c++)
{
if (l[c][col]==num)
counter=counter+1;
}
if (counter>0)
return 1;
else
return 0;
}
int rowcolnotexist(int x[9][9],int row , int col) // to find a nuber which does not exists int a row and column
{
for (int c=1 ; c<=9 ; c++)
{
if ( rowsearch(x,row,c)!=1 && colsearch(x,col,c)!=1)
return c;
}
return 0;
}
int main()
{
int l[9][9]={};
// input of the list
for (int i=0 ; i<9 ; i++)
for (int j=0 ; j<9 ; j++)
{
cout<<"Enter "<<i+1<<"*"<<j+1<<"entry of the list(For not entering a number enter 0).";
cin>>l[i][j];
}
// operations
for (int i=0 ; i<9 ; i++)
{
for (int j=0 ; j<9 ; j++)
if (l[i][j]==0)
l[i][j]=rowcolnotexist(l,i,j);
}
// printing list
for (int i=0 ; i<9 ; i++)
{
for (int j=0 ; j<9 ; j++)
{
cout<<l[i][j];
if ((j+1)%3==0)
cout<<" ";
else
cout<<" ";
}
if ((i+1)%3==0)
cout<<"\n\n\n";
else
cout<<"\n\n";
}
return 0;
}
答案 0 :(得分:2)
我建议我自己解决它时使用的算法相同; - )
根据所有其他行中的内容选择一个任意方格并列出它的所有有效值(可能有一种方法可以更有效地决定开始哪个方格)。
然后转到相关的空方(可能有一种方法可以更有效地决定下一个要检查的方格)并存储所有可能的值。
冲洗并重复,直到找到只有一个有效值的正方形。
然后解压缩。
这应该听起来像一个递归问题,到现在为止。 (注意:几乎所有可以递归完成的事情都可以按常规进行,但想法是一样的。)
所以,存储一个部分解决的方块列表,当你到达一个已经完全解决的方格时,以相反的顺序返回列表,用新数据重新评估你的部分解决方案(即你的那个)能够解决。)
冲洗并重复全身和体积。