[cqoi2013]新数独
问题 G: [cqoi2013]新数独
时间限制: 1 Sec 内存限制: 128 MB题目描述
输入
输入一共15行,包含一个新数独的实例。第奇数行包含左右方向的符号(<和>),第偶数行包含上下方向的符号(^和v)。
输出
输出包含9行,每行9个1~9的数字,以单个空格隔开。输入保证解惟一。
样例输入
< > > < > <
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
< > < > < >
样例输出
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
SOLUTION:
什么都不说上来就搜吧,顺便引用一句森林之王wq的名言,屎只有亲自尝尝才知道臭QAQ。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 int sym[10][10][10][10]; 7 int gege[7]= {1,2,4,5,7,8},now[10][10],belong[10][10],xx[4]= {1,-1,0,0},yy[4]= {0,0,1,-1}; 8 bool hang[10][10],lie[10][10],blo[10][10]; 9 __attribute__((optimize("O3")))int change(char ch) { //dayu 1 xiaoyu 0 10 if(ch=='>'||ch=='v') { 11 return 1; 12 } else { 13 return 0; 14 } 15 } 16 __attribute__((optimize("O3")))void init() { 17 memset(sym,0xff,sizeof(sym)); 18 for(int i=1; i<=3; i++) { 19 for(int j=1; j<=3; j++) belong[i][j]=1; 20 for(int j=4; j<=6; j++) belong[i][j]=2; 21 for(int j=7; j<=9; j++) belong[i][j]=3; 22 } 23 for(int i=4; i<=6; i++) { 24 for(int j=1; j<=3; j++) belong[i][j]=4; 25 for(int j=4; j<=6; j++) belong[i][j]=5; 26 for(int j=7; j<=9; j++) belong[i][j]=6; 27 } 28 for(int i=7; i<=9; i++) { 29 for(int j=1; j<=3; j++) belong[i][j]=7; 30 for(int j=4; j<=6; j++) belong[i][j]=8; 31 for(int j=7; j<=9; j++) belong[i][j]=9; 32 } 33 } 34 __attribute__((optimize("O3")))void read() { 35 char s; 36 for(int i=1; i<=15; ++i) { 37 if(i<=5) { 38 if(i&1) { 39 for(int j=0; j<6; ++j) { 40 cin>>s; 41 sym[(i>>1)+1][gege[j]][(i>>1)+1][gege[j]+1]=change(s); 42 sym[(i>>1)+1][gege[j]+1][(i>>1)+1][gege[j]]=!sym[(i>>1)+1][gege[j]][(i>>1)+1][gege[j]+1]; 43 } 44 } else { 45 for(int j=1; j<=9; ++j) { 46 cin>>s; 47 sym[(i>>1)][j][(i>>1)+1][j]=change(s); 48 sym[(i>>1)+1][j][(i>>1)][j]=!sym[(i>>1)][j][(i>>1)+1][j]; 49 } 50 } 51 } 52 if(6<=i&&i<=10) { 53 if(!(i&1)) { 54 for(int j=0; j<6; ++j) { 55 cin>>s; 56 sym[(i>>1)+1][gege[j]][(i>>1)+1][gege[j]+1]=change(s); 57 sym[(i>>1)+1][gege[j]+1][(i>>1)+1][gege[j]]=!sym[(i>>1)+1][gege[j]][(i>>1)+1][gege[j]+1]; 58 } 59 } else { 60 for(int j=1; j<=9; ++j) { 61 cin>>s; 62 sym[(i>>1)+1][j][(i>>1)+2][j]=change(s); 63 sym[(i>>1)+2][j][(i>>1)+1][j]=!sym[(i>>1)+1][j][(i>>1)+2][j]; 64 } 65 } 66 } 67 if(i>=11) { 68 if(i&1) { 69 for(int j=0; j<6; ++j) { 70 cin>>s; 71 sym[(i+3)>>1][gege[j]][(i+3)>>1][gege[j]+1]=change(s); 72 sym[(i+3)>>1][gege[j]+1][(i+3)>>1][gege[j]]=!sym[(i+3)>>1][gege[j]][(i+3)>>1][gege[j]+1]; 73 } 74 } else { 75 for(int j=1; j<=9; ++j) { 76 cin>>s; 77 sym[((i+3)>>1)][j][((i+3)>>1)+1][j]=change(s); 78 sym[((i+3)>>1)+1][j][((i+3)>>1)][j]=!sym[((i+3)>>1)][j][((i+3)>>1)+1][j]; 79 } 80 } 81 } 82 } 83 } 84 __attribute__((optimize("O3")))bool check(int x,int y,int num) { 85 for(int i=0; i<4; ++i) { 86 if(now[x+xx[i]][y+yy[i]]==0||sym[x][y][x+xx[i]][y+yy[i]]==-1) { 87 continue; 88 } 89 if(now[x+xx[i]][y+yy[i]]&&sym[x][y][x+xx[i]][y+yy[i]]==1&&num<now[x+xx[i]][y+yy[i]]) { 90 return false; 91 } 92 if(now[x+xx[i]][y+yy[i]]&&sym[x][y][x+xx[i]][y+yy[i]]==0&&num>now[x+xx[i]][y+yy[i]]) { 93 return false; 94 } 95 } 96 return true; 97 } 98 __attribute__((optimize("O3")))void print() { 99 for(int i=1; i<=9; ++i,printf("\n")) { 100 for(int j=1; j<=9; ++j) { 101 printf("%d ",now[i][j]); 102 } 103 } 104 return ; 105 } 106 bool ans=false; 107 int ji; 108 __attribute__((optimize("O3")))void dfs(int x,int y) { 109 if(x==9&&y==9) { 110 for(int num=1; num<=9&&!ans; ++num) { 111 if(hang[x][num]||lie[y][num]||blo[belong[x][y]][num]||!check(x,y,num)) { 112 continue; 113 } else { 114 now[x][y]=num; 115 print(); 116 ans=true; 117 } 118 } 119 return ; 120 } 121 int up=9,down=1; 122 for(int i=0; i<4; ++i) { 123 if(sym[x][y][x+xx[i]][y+yy[i]]==1) { 124 ++down; 125 } 126 if(sym[x][y][x+xx[i]][y+yy[i]]==0) { 127 --up; 128 } 129 } 130 for(int num=down; num<=up&&!ans; ++num) { 131 if(hang[x][num]||lie[y][num]||blo[belong[x][y]][num]||!check(x,y,num)) { 132 continue; 133 } 134 now[x][y]=num; 135 hang[x][num]=lie[y][num]=blo[belong[x][y]][num]=true; 136 if(x&1) { 137 if(y<9) { 138 dfs(x,y+1); 139 } else { 140 dfs(x+1,y); 141 } 142 } else { 143 if(y>1) { 144 dfs(x,y-1); 145 } else { 146 dfs(x+1,y); 147 } 148 } 149 now[x][y]=0; 150 hang[x][num]=lie[y][num]=blo[belong[x][y]][num]=false; 151 } 152 return ; 153 } 154 __attribute__((optimize("O3")))int main() { 155 init(); 156 read(); 157 dfs(1,1); 158 return 0; 159 }