现在的位置: 首页 > 综合 > 正文

搜索之N皇后问题

2013年02月23日 ⁄ 综合 ⁄ 共 774字 ⁄ 字号 评论关闭

也不知道是第几次写这个了,应该掌握了吧????这是一道很经典的DFS题目,

很经典的模版,

DFS:

首先,要有结束条件,

然后要有,搜索条件,就是满足了什么样的条件才会去搜索.

贴出我的代码:

/*
 *N皇后问题
 *是一个很典型的DFS
 *而且也很典型 
 */
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>

using namespace std;

int cnt;//用来记录成立的次数 

int vis[3][55];//0,代表的是列数是否已经被访问,1,表示右斜方向是不是被访问了,2,表示左斜是不是被访问了 

int N;//代表皇后的个数 

void Init()
{
	memset(vis, 0, sizeof(vis));//将vis全部置零 
	cnt = 0;//将统计成立次数置零 
}

void DFS(int cur)
{
	if (cur == N + 1)//如果已经全部访问了一遍且都成功了,次数加1,返回. (结束条件)
	{
		cnt++;
		return ;
	}
	for (int i = 1; i <= N; i++)
	{
		if (!vis[0][i] && !vis[1][cur + i] && !vis[2][i - cur + N])//(搜索条件)
		{
			vis[0][i] = vis[1][cur + i] = vis[2][i - cur + N] = 1;
			DFS(cur + 1);
			vis[0][i] = vis[1][cur + i] = vis[2][i - cur + N] = 0;//这一点很容易犯错,一定要弄清楚是不是回溯的算法. 
		}														  //而这个N皇后问题,确实是一个回溯的算法.	
	} 
}

int main()
{
	while (scanf("%d", &N) != EOF)
	{
		Init();//每次都要进行一次初始化 
		DFS(1);
		printf("%d\n", cnt);
	} 
	system("pause");
	return 0;
}
 

抱歉!评论已关闭.