2

我想制作一个解决 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;
}
4

1 回答 1

2

我会推荐我自己解决它们时使用的相同算法;-)

根据所有其他行中存在的内容,选择一个任意方块并列出它的所有有效值(可能有一种方法可以更有效地决定从哪个方块开始)。

然后移动到一个相关的空方格(可能有一种方法可以更有效地决定下一个检查哪个方格)并存储其所有可能的值。

冲洗并重复,直到找到一个只有一个有效值的正方形。

然后解压。

到目前为止,这听起来应该是一个递归问题。(注意:几乎所有可以递归完成的事情都可以按照惯例完成,但想法是一样的)。

所以,存储一个部分解决的正方形列表,当你到达一个完全解决的正方形时,以相反的顺序返回你的列表,用新数据重新评估你的部分解决方案(即,你能够解决)。

冲洗并重复整个身体和体积。

于 2013-11-08T16:08:28.740 回答