dfs hdu 1426 soduku killer

来源:互联网 发布:ios 模仿淘宝商品详情 编辑:程序博客网 时间:2024/04/29 04:07

只想说:the devil is in the details.


http://acm.hdu.edu.cn/showproblem.php?pid=1426


#include<stdio.h>struct node{    int x,y;}p,space[82];int sodu[9][9],cnt;/*数据比较弱,不管怎么dfs都能过此dfs的耗时是下面的1/3*/bool dfs(int t){    int i,j,k;    if(t==cnt)    {        for(i=0;i<9;++i)        {            for(j=0;j<8;++j)                printf("%d ",sodu[i][j]);            printf("%d\n",sodu[i][j]);        }        return 1;    }    int vis[10]={0};    i=space[t].x;    j=space[t].y;    for(k=0;k<9;++k)        vis[sodu[i][k]]=vis[sodu[k][j]]=1;    i=space[t].x/3*3;    j=space[t].y/3*3;    /*    之前错误写法,丫的j的循环显然错了,竟然给我报TLE而不是WA,纠结啊    int ii=i+3,        jj=j+3;    for(;i<ii;++i)        for(;j<jj;++j)            vis[sodu[i][j]]=1;    */    int ii=i+3,        jj=j;    for(;i<ii;++i)        for(j=jj;j<jj+3;++j)            vis[sodu[i][j]]=1;    for(i=1;i<10;++i)        if(!vis[i])        {            sodu[space[t].x][space[t].y]=i;            if(dfs(t+1))                return 1;            sodu[space[t].x][space[t].y]=0;        }    return 0;}int main(){    int i,j,ca=0;    char s[2];    while(scanf("%s",s)==1)    {        cnt=1;        if(s[0]=='?')        {            space[cnt].x=0;            space[cnt++].y=0;            sodu[0][0]=0;        }        else            sodu[0][0]=s[0]-'0';        for(j=1;j<9;++j)        {            scanf("%s",s);            if(s[0]=='?')            {                space[cnt].x=0;                space[cnt++].y=j;                sodu[0][j]=0;            }            else                sodu[0][j]=s[0]-'0';        }        for(i=1;i<9;++i)            for(j=0;j<9;++j)            {                scanf("%s",s);                if(s[0]=='?')                {                    sodu[i][j]=0;                    space[cnt].x=i;                    space[cnt++].y=j;                }                else                    sodu[i][j]=s[0]-'0';            }        if(ca)            printf("\n");        ca++;        dfs(1);    }    return 0;}/*#include<stdio.h>struct node{    int x,y;}sp[82];int sodu[9][9],cnt,flag;bool ok(int k,int t){    int i,j,c;    for(c=0;c<9;++c)        if((sodu[sp[t].x][c]==k)||(sodu[c][sp[t].y]==k))            return 0;     i=sp[t].x/3*3;        j=sp[t].y/3*3;    int ii=i+3,jj=j;    for(;i<ii;++i)        for(j=jj;j<jj+3;++j)            if(sodu[i][j]==k)                return 0;    return 1;}int dfs(int t){    int i,j;    if(t==cnt)    {        for(i=0;i<9;++i)        {            for(j=0;j<8;++j)                printf("%d ",sodu[i][j]);            printf("%d\n",sodu[i][j]);        }        //printf("\n");        flag=1;        return 1;    }    for(i=1;i<10;++i)    {        j=sodu[sp[t].x][sp[t].y];        if(ok(i,t))        {            sodu[sp[t].x][sp[t].y]=i;            if(dfs(t+1))                return 1;            sodu[sp[t].x][sp[t].y]=j;        }    }    return 0;}int main(){    int i,j,ca=0;    char s[2];    while(scanf("%s",s)!=EOF)    {        cnt=0;        if(s[0]=='?')        {            sp[cnt].x=0;            sp[cnt++].y=0;            sodu[0][0]=0;        }        else            sodu[0][0]=s[0]-'0';        for(j=1;j<9;++j)        {            scanf("%s",s);            if(s[0]=='?')            {                sp[cnt].x=0;                sp[cnt++].y=j;                sodu[0][j]=0;            }            else                sodu[0][j]=s[0]-'0';        }        for(i=1;i<9;++i)            for(j=0;j<9;++j)            {                scanf("%s",s);                if(s[0]=='?')                {                    sodu[i][j]=0;                    sp[cnt].x=i;                    sp[cnt++].y=j;                }                else                    sodu[i][j]=s[0]-'0';            }        flag=0;        if(ca)            printf("\n");        ca++;        dfs(0);    }    return 0;}*/


原创粉丝点击