[cqoi2013]新数独

Posted Mafia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[cqoi2013]新数独相关的知识,希望对你有一定的参考价值。

[cqoi2013]新数独

题目

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
 < >   < >  < >

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

解题报告

裸搜

记录一下各点之间的大小关系,记录一下各点的出度入度来确定枚举范围(这里的出度入度指有几个数比他大,几个数比他小)

搜就可以了

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<cstdlib>
  5 using namespace std;
  6 inline char read(){
  7     char ch(getchar());
  8     while(ch!=\'<\'&&ch!=\'>\'&&ch!=\'v\'&&ch!=\'^\')
  9         ch=getchar();
 10     return ch;
 11 }
 12 bool h[10][10],l[10][10],jgg[10][10];
 13 int dx[10][10][10][10];
 14 int indegree[10][10],outdegree[10][10];
 15 inline void insert(int a,int b,int c,int d){
 16     ++indegree[c][d];
 17     ++outdegree[a][b];
 18     dx[a][b][c][d]=1;
 19     dx[c][d][a][b]=-1;
 20 }
 21 int ans[10][10];
 22 bool vis[10][10];
 23 inline bool judge(int x,int y,int zhi){
 24     if(x!=1&&vis[x-1][y]&&dx[x][y][x-1][y]!=0){
 25         if(dx[x][y][x-1][y]==1&&zhi>=ans[x-1][y])
 26             return false;
 27         if(dx[x][y][x-1][y]==-1&&zhi<=ans[x-1][y])
 28             return false;
 29     }
 30     if(x!=9&&vis[x+1][y]&&dx[x][y][x+1][y]!=0){
 31         if(dx[x][y][x+1][y]==1&&zhi>=ans[x+1][y])
 32             return false;
 33         if(dx[x][y][x+1][y]==-1&&zhi<=ans[x+1][y])
 34             return false;
 35     }
 36     if(y!=1&&vis[x][y-1]&&dx[x][y][x][y-1]!=0){
 37         if(dx[x][y][x][y-1]==1&&zhi>=ans[x][y-1])
 38             return false;
 39         if(dx[x][y][x][y-1]==-1&&zhi<=ans[x][y-1])
 40             return false;
 41     }
 42     if(y!=9&&vis[x][y+1]&&dx[x][y][x][y+1]!=0){
 43         if(dx[x][y][x][y+1]==1&&zhi>=ans[x][y+1])
 44             return false;
 45         if(dx[x][y][x][y+1]==-1&&zhi<=ans[x][y+1])
 46             return false;
 47     }
 48     return true;
 49 }
 50 inline void print(){
 51     for(int i=1;i<=9;++i){
 52         for(int j=1;j<9;++j)
 53             printf("%d ",ans[i][j]);
 54         printf("%d\\n",ans[i][9]);
 55     }
 56 }
 57 int bl[10][10];
 58 inline void dfs(int x,int y){
 59     vis[x][y]=1;
 60     for(int i=indegree[x][y]+1;i<=9-outdegree[x][y];++i)
 61         if(!h[x][i]&&!l[y][i]&&!jgg[bl[x][y]][i]&&judge(x,y,i)){
 62             h[x][i]=l[y][i]=jgg[bl[x][y]][i]=1;
 63             ans[x][y]=i;
 64             if(x==9&&y==9){
 65                 print();
 66                 exit(0);
 67             }
 68             if(y==9)
 69                 dfs(x+1,1);
 70             else
 71                 dfs(x,y+1);
 72             h[x][i]=l[y][i]=jgg[bl[x][y]][i]=0;
 73         }
 74     vis[x][y]=0;
 75 }
 76 int main(){
 77     for(int i=1,cnt=0;i<=9;++i)
 78         for(int j=1;j<=9;++j)
 79             bl[i][j]=((i-1)/3)*3+(j-1)/3+1;
 80     for(int i=1;i<=15;++i){
 81         int pos1,pos2;
 82         if(i==1||i==3||i==5||i==6||i==8||i==10||i==11||i==13||i==15){
 83             if(i==1)pos1=1;
 84             if(i==3)pos1=2;
 85             if(i==5)pos1=3;
 86             if(i==6)pos1=4;
 87             if(i==8)pos1=5;
 88             if(i==10)pos1=6;
 89             if(i==11)pos1=7;
 90             if(i==13)pos1=8;
 91             if(i==15)pos1=9;
 92             for(int j=1;j<=6;++j){
 93                 if(j==1)pos2=1;
 94                 if(j==2)pos2=2;
 95                 if(j==3)pos2=4;
 96                 if(j==4)pos2=5;
 97                 if(j==5)pos2=7;
 98                 if(j==6)pos2=8;
 99                 char tp(read());
100                 if(tp==\'<\')
101                     insert(pos1,pos2,pos1,pos2+1);
102                 else
103                     insert(pos1,pos2+1,pos1,pos2);
104             }
105         }
106         else{
107             if(i==2)pos1=1;
108             if(i==4)pos1=2;
109             if(i==7)pos1=4;
110             if(i==9)pos1=5;
111             if(i==12)pos1=7;
112             if(i==14)pos1=8;
113             for(int j=1;j<=9;++j){
114                 pos2=j;
115                 char tp(read());
116                 if(tp==\'^\')
117                     insert(pos1,pos2,pos1+1,pos2);
118                 else
119                     insert(pos1+1,pos2,pos1,pos2);
120             }
121         }
122     }
123     dfs(1,1);
124 }
View Code

 

以上是关于[cqoi2013]新数独的主要内容,如果未能解决你的问题,请参考以下文章

[cqoi2013]新数独

CQOI2013 新数独

bzoj 3109: [cqoi2013]新数独

bzoj3109 [cqoi2013]新数独

3109. [CQOI2013]新数独搜索

刷题搜索新数独