杭电 HOJ 1426 Sudoku Killer 解题报告

    数独,才发现可以用回溯做呀,哈哈。代码如下,注意判断文件结束:

#include <iostream>

using namespace std;



struct point

{

    int x,y;

} p[101];



int num,flag,row[10][10],col[10][10],dia[10][10],mat[10][10];



void DFS(int a)

{

    int i,j,x,y,t;

    if(a==num)

    {

        flag=1;

        return;

    }

    x=p[a].x;

    y=p[a].y;

    for(i=1;i<=9;i++)

        if(!row[x][i] && !col[y][i] && !dia[t=(x-1)/3*3+(y-1)/3+1][i])

        {

            row[x][i]=col[y][i]=dia[t][i]=1;

            mat[x][y]=i;

            DFS(a+1);

            if(flag)

                return;

            mat[x][y]=0;

            row[x][i]=col[y][i]=dia[t][i]=0;

        }

}



int main()

{

    int i,j,t,first=1;

    char c;

    while(cin>>c)

    {

        if(first)

            first=0;

        else

            cout<<endl;

        

        flag=0;

        num=1;

        memset(col,0,sizeof(col));

        memset(row,0,sizeof(row));

        memset(dia,0,sizeof(dia));

        memset(mat,0,sizeof(mat));



        for(i=1;i<=9;i++)

            for(j=1;j<=9;j++)

            {

                if(i!=1||j!=1)

                    cin>>c;

                if(c=='?')

                {

                    p[num].x=i;

                    p[num++].y=j;

                }

                else

                {

                    t=mat[i][j]=c-'0';

                    row[i][t]=col[j][t]=dia[(i-1)/3*3+(j-1)/3+1][t]=1;

                }

            }

        DFS(1);

        for(i=1;i<=9;i++)

        {

            for(j=1;j<=8;j++)

                cout<<mat[i][j]<<' ';

            cout<<mat[i][j]<<endl;

        }

    }

}

 

你可能感兴趣的:(sudo)