DFS/BFS的小白整理(一)

N皇后问题(dfs)

题目

可以算得上是模板题目/裸题了
SDNU 1559
 emmm当时还傻傻的用暴力做过

先贴上不用dfs的方法

PS:这里先解释一下next_permutation函数,简单的来说就是把一堆数进行全排列(按一定顺序),我嘴笨肯定解释不明白,所以还请各位移步这篇博客或自行百度进行了解,当然,不懂原理直接用也是可以的。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[15];
bool check()
{
	int w=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			if(a[i]+(j-i)==a[j]||a[i]-(j-i)==a[j])//检验是否在一条对角线上
			{
				w=0;break;
			}
			else w=1; 
		}
		if(w==0)break;
	}
	if(w==1)return true;
	else return false;
}
int main()
{
	int ans;
	while(cin>>n)
	{
		if(n==0)break;
		ans=0;
		for(int i=1;i<=n;i++)a[i]=i;
		do
		{
			if(check())ans++;
		}while(next_permutation(a+1,a+n+1));
		cout<<ans<<endl;
	}
	return 0;
} 

方法二:(dfs)

管他会不会,先把代码贴上

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int b[13],a[13];
int n,i;int ans;
void dfs(int x)   //dfs函数是关键
{
	bool w=1;
	if(x==i+1)  	//当搜完最后一行之后结束递归
	{
		ans++;return ;
	}
	for(int j=1;j<=i;j++)  //从第1列开始放,一共j列
	{
		b[x]=j;w=1;			//b[x]代表第x行放在哪个位置
		for(int k=1;k<x;k++)
		{
			if(b[x-k]==j||fabs(x-k)==fabs(j-b[k]))//判断是否在同一对角线上
			{
				w=0;break;
			}
		}
		if(w==1)
		dfs(x+1);
	}
}
int main()
{
	for(i=1;i<=10;i++)   //打表
	{
		ans=0;
		dfs(1);
		a[i]=ans;
	}
	while(cin>>n)
	{
		if(n==0)break;
		cout<<a[n]<<endl;
	}	
	return 0;
}

暴力搜索,从第一行第一个开始一个个放,可行就在下一行放,直到该情况放完,ans+1,直到搜完,得出结果。

PS:虽然很简单但一开始却花了好长时间理解,至于应用简单的还可以,复杂的恐怕还会出错,,,真是菜的可以,,,/捂脸

发布了11 篇原创文章 · 获赞 2 · 访问量 4019

猜你喜欢

转载自blog.csdn.net/qq_39657434/article/details/103037604
今日推荐