DFS解八皇后

我是学习这个博客的–>八皇后问题(dfs常规解法)
dfs还是用的不太灵活
题目的思路很中重要:

分界线

用一维数组存储每一行的列数,从第一行开始深搜,对于每一行i,对从1到8列进行判断是否符合,符合就加入,然后深搜下一层。

#include<bits/stdc++.h>
using namespace std;
int s;
int a[10];
void dfs(int i){//i表示现在要放入的行 
	if(i==9){
		s++;
		return;
	}
	for(int j=1;j<=8;j++){//遍历列
		a[i]=j; 
		bool ok=true;
		for(int ii=1;ii<i;ii++){//遍历前面的行 
			if(a[ii]==j||a[ii]-ii==j-i||a[ii]+ii==j+i){//判断是否符合 
				ok=false;
				break;
			}
		}
		if(ok)dfs(i+1);
	}
	return;
}
int main(){
	s=0;
	dfs(1);
	cout<<s<<endl;
	return 0;
}

另一个,不会超时

#include<iostream>
#include<cstring> 
using namespace std;
int a[20];
int b[20],c[100],d[100];//记录列,左对角线,右对角线 
int n,s;
int t=0;
void dfs(int i){
	if(i==n+1){
		s++;
		//if(t>=3)return ;
		//for(int k=1;k<=n;k++)
		//	cout<<a[k]<<" ";
		//t++;	
		//cout<<endl;
		return;
	}
	for(int j=1;j<=n;j++){
		if(b[j]==0&&c[i+j]==0&&d[i-j+14]==0){
			a[i]=j;
			b[j]=1;
			c[i+j]=1;
			d[i-j+14]=1;
			dfs(i+1);
			b[j]=0;
			c[i+j]=0;
			d[i-j+14]=0;
		}
	}
	return;
}

int main(){
	s=0;
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	memset(d,0,sizeof(d));
	cin>>n;
	dfs(1);
	cout<<s<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值