首页 > 代码库 > bzoj3109 [cqoi2013]新数独

bzoj3109 [cqoi2013]新数独

Description

技术分享

Input

输入一共15行,包含一个新数独的实例。第奇数行包含左右方向的符号(<和>),第偶数行包含上下方向的符号(^和v)。
 

Output

输出包含9行,每行9个1~9的数字,以单个空格隔开。输入保证解惟一。

Sample Input

< > > < > <
v v ^ ^ v v ^ ^ ^
< < > < > <
^ ^ ^ v ^ ^ ^ v v
< < < < > >
> < > > > >
v ^ ^ ^ ^ v v v ^
> > > > < >
v v ^ v ^ v ^ v ^
> < < > > >
< < < < > <
v ^ v v v v ^ ^ v
< > > < < >
^ v v v ^ v ^ v v
< > < > < >

Sample Output

4 9 1 7 3 6 5 2 8
2 3 7 8 1 5 6 4 9
5 6 8 2 4 9 7 3 1
9 1 3 6 5 4 8 7 2
8 5 4 9 7 2 1 6 3
7 2 6 3 8 1 9 5 4
3 4 9 5 6 8 2 1 7
1 8 5 4 2 7 3 9 6
6 7 2 1 9 3 4 8 5

题解

搜索裸题。。当做是锻炼代码能力吧。。。

注意输出格式

代码

#include <cstdio>
#include <cstring>
using namespace std;
int i,j,k,n,m,x,y,t,a[10][10],b[10][10],ans[10][10];
bool b1[10][10],b2[10][10],b3[10][10],b4[10],flag=false;
char s[20];
int calc(int x,int y){return (((x-1)/3+1)-1)*3+((y-1)/3+1);}
int min(int x,int y){return x<y?x:y;}
int max(int x,int y){return x>y?x:y;}
void dfs(int mn,int mx,int x,int y){
    if (x==10){flag=true;return;}
    for (int i=mn;i<=mx;i++)if (!b1[i][x]&&!b2[i][y]&&!b3[i][calc(x,y)]){
        b1[i][x]=1;b2[i][y]=1;b3[i][calc(x,y)]=1;ans[x][y]=i;
        if (y==9){
            if (b[x+1][1]==0)dfs(1,9,x+1,1);
            else if (b[x+1][1]==1)dfs(1,ans[x][1],x+1,1);
            else if (b[x+1][1]==2)dfs(ans[x][1],9,x+1,1);
            if (flag)return;
        }
        else{
            if (b[x][y+1]==0){
                if (a[x][y+1]==0)dfs(1,9,x,y+1);
                else if (a[x][y+1]==1)dfs(1,ans[x][y],x,y+1);
                else if (a[x][y+1]==2)dfs(ans[x][y],9,x,y+1);
            }
            else if (b[x][y+1]==1){
                if (a[x][y+1]==0)dfs(1,ans[x-1][y+1],x,y+1);
                else if (a[x][y+1]==1)dfs(1,min(ans[x][y],ans[x-1][y+1]),x,y+1);
                else if (a[x][y+1]==2)dfs(ans[x][y],ans[x-1][y+1],x,y+1);
            }
            else if (b[x][y+1]==2){
                if (a[x][y+1]==0)dfs(ans[x-1][y+1],9,x,y+1);
                else if (a[x][y+1]==1)dfs(ans[x-1][y+1],ans[x][y],x,y+1);
                else if (a[x][y+1]==2)dfs(max(ans[x-1][y+1],ans[x][y]),9,x,y+1);
            }
            if (flag)return;
        }
        b1[i][x]=0;b2[i][y]=0;b3[i][calc(x,y)]=0;
    }
    return;
}
int main(){
    for (i=1;i<=15;i++){
        if (((i-1)%5+1)&1){
            x++;y=0;gets(s);
            for (k=0;k<strlen(s);k++)
                if (s[k]==>){y++;if (y==1)a[x][2]=1;else if (y==2)a[x][3]=1;else if (y==3)a[x][5]=1;else if(y==4)a[x][6]=1;else if (y==5)a[x][8]=1;else if (y==6)a[x][9]=1;}
                else if(s[k]==<){y++;if (y==1)a[x][2]=2;else if (y==2)a[x][3]=2;else if (y==3)a[x][5]=2;else if(y==4)a[x][6]=2;else if (y==5)a[x][8]=2;else if (y==6)a[x][9]=2;}
        }
        else{y=0;gets(s);for (k=0;k<strlen(s);k++)if (s[k]==v)b[x+1][++y]=1;else if (s[k]==^)b[x+1][++y]=2;}
        if (i!=15)scanf("\n");
    }
    dfs(1,9,1,1);
    for (i=1;i<=9;i++){for (j=1;j<=8;j++)printf("%d ",ans[i][j]);printf("%d\n",ans[i][9]);}
    return 0;
}

 

bzoj3109 [cqoi2013]新数独