[cqoi2013]新数独

Posted Forever_goodboy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 }

 

 

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

[cqoi2013]新数独

CQOI2013 新数独

bzoj 3109: [cqoi2013]新数独

bzoj3109 [cqoi2013]新数独

3109. [CQOI2013]新数独搜索

刷题搜索新数独