标签:exactly any inpu ble for square == img should
Time Limit: 2000MS | Memory Limit: 65536K | |||
Total Submissions: 14368 | Accepted: 7102 | Special Judge |
Description
Input
Output
Sample Input
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
Sample Output
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
Source
1 #include <cstdio> 2 char s[10]; 3 int num[9][9]; 4 bool flag; 5 6 bool ok(int n, int cur) 7 { 8 int r = n / 9; //当前行 9 int c = n % 9; //当前列 10 for(int j = 0; j < 9; j++) //枚举列 11 if (num[r][j] == cur) 12 return false; 13 for(int i = 0; i < 9; i++) //枚举行 14 if (num[i][c] == cur) 15 return false; 16 //得到当前所在的子矩阵的第一个元素位置 17 int x = r / 3 * 3; 18 int y = c / 3 * 3; 19 //枚举子矩阵中的元素 20 for(int i = x; i < x + 3; i++) 21 for(int j = y; j < y + 3; j++) 22 if (num[i][j] == cur) 23 return false; 24 return true; 25 } 26 27 void DFS(int n) 28 { 29 if(n > 80 || flag) 30 { 31 flag = true; 32 return; 33 } 34 if(num[n / 9][n % 9])//当前位置有数字直接搜索下一位 35 { 36 DFS(n + 1); 37 if(flag) 38 return; 39 } 40 else 41 { 42 for(int cur = 1; cur <= 9; cur++) //枚举数字 43 { 44 if(ok(n, cur)) //若ok则插入 45 { 46 num[n / 9][n % 9] = cur; 47 DFS(n + 1); 48 if(flag) 49 return; 50 num[n / 9][n % 9] = 0; //还原 51 } 52 } 53 } 54 } 55 56 int main() 57 { 58 int T; 59 scanf("%d", &T); 60 while(T--) 61 { 62 flag = false; 63 for(int i = 0; i < 9; i++) //得到数独矩阵 64 { 65 scanf("%s", s); 66 for(int j = 0; j < 9; j++) 67 num[i][j] = (s[j] - ‘0‘); 68 } 69 DFS(0); //从第一位开始搜 70 for(int i = 0; i < 9; i++) 71 { 72 for(int j = 0; j < 9; j++) 73 printf("%d", num[i][j]); 74 printf("\n"); 75 } 76 } 77 }
题解来源:http://blog.csdn.net/tc_to_top/article/details/43699047
标签:exactly any inpu ble for square == img should
原文地址:http://www.cnblogs.com/huashanqingzhu/p/7587952.html