HDU 2553 N皇后问题(深搜+回溯)

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]--;

		}

	}

}



 

你可能感兴趣的:(HDU)