hdu 3111 Sudoku(DFS数独)

来源:互联网 发布:文华财经 mac版 编辑:程序博客网 时间:2024/05/16 12:48

题目链接:hdu3111

果断水过....

#include<stdio.h>int map[9][9];int flag,num;struct node{    int x,y;}s[81];bool judge(int t,int cur){    int i,j;    for(i = 0 ; i < 9 ;i ++)     if( map[i][ s[cur].y ] == t || map[ s[cur].x ][i] == t)      return 0;    int x = s[cur].x/3*3;    int y = s[cur].y/3*3;    for(i = 0 ; i < 3 ; i ++)     for(j = 0 ; j < 3 ; j ++)      if(map[x + i][y + j] == t)       return 0;    return 1;}void dfs(int cur){    int i;    if(cur == num)    {        flag = 1;        return ;    }    if(flag) return;    for(i = 1 ; i <= 9 ; i++)      if(judge(i,cur) && !flag)      {          map[ s[cur].x ][ s[cur].y ] = i;          dfs(cur + 1);          if(flag) return ;          map[ s[cur].x ][ s[cur].y ] = 0;      }}int main(){    //freopen("in.txt","r",stdin);    int T,i,j,p = 0;    char a[10];    scanf("%d",&T);    while(T--)    {        num = 0;        if(p)scanf("%s",a);        for(i = 0 ; i < 9 ; i ++)        {            scanf("%s",a);            for(j = 0 ; j < 9 ; j ++)            {                if(a[j] == '?')                {                    s[num].x = i;                    s[num].y = j;                    num ++;                    map[i][j] = 0;                    continue;                }                map[i][j] = a[j] - '0';            }        }        flag = 0;        dfs(0);        if(p) printf("---\n");        if(flag)        {            for(i = 0 ; i < 9 ; i ++)            {                for(j = 0 ; j < 9 ; j ++)                {                    printf("%d",map[i][j]);                }                printf("\n");            }        }        else          printf("impossible\n");        p ++;    }    return 0;}



原创粉丝点击