http://acm.hdu.edu.cn/showproblem.php?pid=2553
回溯法,一直错在了标记为1,0上面,应该标记为++,这样回溯的时候才不会把别人的点还原;
同时,这一题要记录下来这10个的answer,否则TLE
#include<stdio.h> #include<cstring> #include<algorithm> using namespace std; int t, k, n; char map[105][105] = {0}; void dfs(int x, int y); int main() { while (~scanf("%d", &n) && n!=0) { k = 0; for(int i=1;i<=n;i++) { memset(map,0,sizeof(map)); dfs(1,i); } printf("%d ",k); } } void dfs(int x, int y) { int xx, yy,i ,j; if(x==n) { k++; return; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==x || j==y || x+y==i+j || x-i==y-j) map[i][j]++; //不能直接标记为0,用++能记录该点被用过多少次,否则下次回溯的时候,直接把重复的点他、也还原了 } } for(i=1;i<=n;i++) { if(map[x+1][i] == 0) { dfs(x+1,i); } } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==x || j==y || x+y==i+j || x-i==y-j) map[i][j]--; } } }