26Sudoku Killer

简单题意

数独游戏,给出个数独,填充完整数独

解题思路形成过程

和老师上课讲的例题差不多,不过这个题使用?来代替未填数的位置,只要改一下就好了。记录所有?位置,判断当前空位置是否可以填某个数,然后直接DFS。

感想

做了好几遍才输出正确结果。。累。

AC代码

#include<iostream>
#include<fstream>
using namespace std;
struct point{
    int x,y;
}pur[100];
int map[10][10],flag,num;
int check(int k,int cur){
    int i,j,x,y;
    for(i=0;i<9;i++)
        if(map[pur[cur].x][i]==k||map[i][pur[cur].y]==k)return 0;
    x=(pur[cur].x/3)*3;
    y=(pur[cur].y/3)*3;
    for(i=x;i<x+3;i++)
        for(j=y;j<y+3;j++)
            if(map[i][j]==k)return 0;
    return 1;
}
void DFS(int step){
    int i,j;
    if(step==num){
        for(i=0;i<9;i++){   
            for(j=0;j<8;j++)
                printf("%d ",map[i][j]);
                printf("%d\n",map[i][8]);
            }
            flag=1;
            return;
    }else{
        for(i=1;i<=9;i++){
            if(check(i,step)&&!flag){
                map[pur[step].x][pur[step].y]=i;
                DFS(step+1);
                map[pur[step].x][pur[step].y]=0;
            }
        }
    }
    return;
}
int main(){
    ifstream cin("in.txt");
    freopen("in.txt","r",stdin);
    int i,j,cas=0;
    char s[3];
    while(scanf("%s",s)!=EOF){
        num=0;
        if(s[0]=='?'){pur[num].x=0;pur[num].y=0;num++;map[0][0]=0;}
        else map[0][0]=s[0]-'0';
        for(i=0;i<9;i++)
            for(j=0;j<9;j++){
                if(i==0&&j==0)continue;
                scanf("%s",s);
                if(s[0]=='?'){pur[num].x=i;pur[num].y=j;num++;map[i][j]=0;}
                else map[i][j]=s[0]-'0';
            }
        flag=0;
        if(cas++)printf("\n");
        DFS(0);
    }
    return 0;
}

你可能感兴趣的:(深度优先搜索)