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\n",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]--;
}
}
}