POJ 2676.Sudoku

来源:互联网 发布:手机淘宝滚动图 编辑:程序博客网 时间:2024/06/14 20:26

题目:http://poj.org/problem?id=2676

AC代码(C++):

#include <iostream>#include <algorithm>#include <stdio.h>#include <vector>#include <queue>#include <map>#include <math.h>#include <string>#include <string.h>#include <bitset>#define INF 0xfffffff#define MAXN 100105using namespace std;int num[9][9];bool flag;bool isOK(int x, int y, int k){for(int i = 0; i < 9; i++){if(num[x][i]==k)return false;if(num[i][y]==k)return false;}int xx,yy;xx = x/3;yy = y/3;for(int i = xx*3; i < (xx+1)*3; i++){for(int j = yy*3; j < (yy+1)*3; j++){if(num[i][j]==k)return false;}}return true;}void dfs(int x, int y){if(flag||x==9){flag = true;return;}while(1){if(y==9){y = 0;x++;}if(x==9){flag = true;return;}if(num[x][y]==0)break;y++;}for(int i = 1; i <= 9; i++){if(!isOK(x,y,i))continue;num[x][y] = i;dfs(x,y+1);if(flag)return;num[x][y] = 0;}}int main(){int t;cin>>t;getchar();while(t--){char tmp;for(int i = 0; i < 9; i++)for(int j = 0; j < 10; j++){scanf("%c",&tmp);if(j!=9)num[i][j] = tmp-'0';}flag = false;dfs(0,0);for(int i = 0; i < 9; i++){for(int j = 0; j < 9; j++)printf("%d",num[i][j]);printf("\n");}}}
总结: 很容易超时的深搜题. 同样的思路, 前几次提交一直超时, 经过多次优化减少元操作数后1400ms过了.

原创粉丝点击