POJ 2676

很简单的题目,不知道为什么第一次没做对。隔了两周重做,这次作对了

 

不过,开始也TLE了。原因是开始,我是每次到了3,3  3,6  ...这类点的时候,才开始计算3×3的小方框是否满足要求,在这个DFS中被调用的次数太多

后来,在DFS的过程中直接记录3×3的状态,并且略过初始时有值的方格,减少递归次数。不过后来又在细节上除了问题,调了1小时

 

 

 

 

 

#include <iostream> #include <string> #define F(i,a,b) for (int i=a;i<=b;i++) using namespace std; bool sqr[4][4][10], h[10][10], v[10][10], ori[10][10]; int map[10][10]; bool dfs(int x,int y) { if (y==10) x++, y=1; while (ori[x][y]) { y++; if (y==10) y=1, x++; } if (x==10) { F(i,1,9) { F(j,1,9) printf("%d",map[i][j]); printf("/n"); } return true; } { F(i,1,9) { if (!h[x][i] && !v[y][i] && !sqr[ (x-1)/3+1 ][ (y-1)/3+1 ][i] ) { bool done=false; map[x][y]=i; h[x][i]=true; v[y][i]=true; sqr[ (x-1)/3+1 ][ (y-1)/3+1 ][i]=true; done=dfs(x,y+1); h[x][i]=false; v[y][i]=false; sqr[ (x-1)/3+1 ][ (y-1)/3+1 ][i]=false; if (done) return true; } } } return false; } int main() { string str; int T; cin >> T; F(t,1,T) { memset(ori, 0, sizeof(ori) ); memset(h, 0, sizeof(h) ); memset(v, 0, sizeof(v) ); memset(sqr, 0, sizeof(sqr) ); ori[10][1]=false; F(i,1,9) { cin >> str; F(j,1,9) { map[i][j]=str[j-1]-48; if (map[i][j]!=0) { ori[i][j]=true;; h[i][ map[i][j] ]=true; v[j][ map[i][j] ]=true; sqr[ (i-1)/3+1 ][ (j-1)/3+1 ][ map[i][j] ]=true; } } } dfs(1,1); } return 0; }  

 

 

 

你可能感兴趣的:(String,BI)