zoukankan      html  css  js  c++  java
  • 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("
    ");
        }
        dfs(1,9,1,1);
        for (i=1;i<=9;i++){for (j=1;j<=8;j++)printf("%d ",ans[i][j]);printf("%d
    ",ans[i][9]);}
        return 0;
    }
  • 相关阅读:
    初中生数学题
    防御准备
    约数个数和「SDOI2015」
    暑期集训题目
    【模板】可持久化线段树 1(主席树)
    【模板】可持久化数组(可持久化线段树/平衡树)
    权值线段树&&线段树合并
    回家的路「SHOI 2012」
    Function「ZJOI2009」
    主席树-可持久化线段树学习笔记
  • 原文地址:https://www.cnblogs.com/Acheing/p/6786496.html
Copyright © 2011-2022 走看看