您的位置:首页 > 其它

26Sudoku Killer

2016-04-19 12:27 309 查看
简单题意

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

解题思路形成过程

和老师上课讲的例题差不多,不过这个题使用?来代替未填数的位置,只要改一下就好了。记录所有?位置,判断当前空位置是否可以填某个数,然后直接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(c
a1bf
as++)printf("\n");

        DFS(0);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  深度优先搜索