POJ 2676 - Sudoku(数独)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 2676 - Sudoku(数独)相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:http://poj.org/problem?id=2676
题目大意:
给出一个数字n,表示有n组数据。
每组数据包括一个n*n的数独,0表示未填的数字。数字之间没有空格。
输出填好的数独,使得每行、每列、每个九宫格中的数字都不重复。
分析:
经典搜索题目。
数组一定要开大一点,数组一定要开大一点,数组一定要开大一点。
AC代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 int notel[150][150],notec[150][150],noteg[150][150],mp[150][150],sum; 7 //标记 行、 列、 九宫格, 存储地图, 记录空格数目 8 char tmp; 9 bool flag; 10 11 struct SPACE 12 { 13 int x,y; 14 }q[100]; 15 //存储空格的相关参数 16 17 inline void init() 18 { 19 sum = 0; 20 memset(notel,0,sizeof(notel)); 21 memset(notec,0,sizeof(notec)); 22 memset(noteg,0,sizeof(noteg)); 23 memset(mp,0,sizeof(mp)); 24 memset(q,0,sizeof(q)); 25 flag = false; 26 } 27 28 inline void out() 29 { 30 for(int i = 1;i <= 9;++ i) 31 { 32 for(int j = 1;j <= 9;++ j) 33 printf("%d",mp[i][j]); 34 puts(""); 35 } 36 } 37 38 void dfs(int l,int c,int step) 39 { 40 if(flag == true) return; 41 if(step == sum+1) 42 { 43 flag = true; 44 out(); 45 } 46 if(flag == true) return; 47 int box = 3*((l-1)/3)+((c-1)/3+1); 48 //box存储当前的九宫格标号 49 for(int i = 1;i <= 9;++ i) 50 { 51 if(flag == true) return; 52 if(notel[l][i] == 0 && notec[c][i] == 0 && noteg[box][i] == 0) 53 { 54 notel[l][i] = 1; 55 notec[c][i] = 1; 56 noteg[box][i] = 1; 57 mp[l][c] = i; 58 dfs(q[step+1].x,q[step+1].y,step+1); 59 notel[l][i] = 0; 60 notec[c][i] = 0; 61 noteg[box][i] = 0; 62 } 63 } 64 return; 65 } 66 67 int main() 68 { 69 int T; 70 scanf("%d",&T); 71 getchar(); 72 while(T--) 73 { 74 init(); 75 for(int i = 1;i <= 9;++ i) 76 { 77 for(int j = 1;j <= 9;++ j) 78 { 79 scanf("%c",&tmp),mp[i][j] = tmp-‘0‘; 80 if(mp[i][j]) 81 { 82 notel[i][mp[i][j]] = 1; 83 notec[j][mp[i][j]] = 1; 84 noteg[3*((i-1)/3)+((j-1)/3+1)][mp[i][j]] = 1; 85 } 86 else 87 { 88 sum++; 89 q[sum].x = i,q[sum].y = j; 90 } 91 } 92 getchar(); 93 } 94 dfs(q[1].x,q[1].y,1); 95 } 96 return 0; 97 }
以上是关于POJ 2676 - Sudoku(数独)的主要内容,如果未能解决你的问题,请参考以下文章