深度优先遍历(DFS)经典例题——八皇后问题(北京大学考研复试上机题)

本文详细介绍了如何使用深度优先搜索算法解决八皇后问题,涉及代码编写,特别是如何处理皇后之间的冲突以及在vector中存储和回溯解决方案的过程。最后提到了OJ检测的部分,用于检验程序的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、题目原文

二、题目分析

三、代码书写

四、OJ检测


一、题目原文

二、题目分析

在分析题目前,读者应理解“冲突”的概念。

特别注意的是,每次对vector<int>插入新信息之后,应在末尾将其弹出,因为插入的新信息已通过参数传送到下一层递归或者已经被总记录vector<vector<int>>记录下来,弹出的意图在于让第n个皇后的插入位置随着循环而不断改变,直至遍历完所有的可能的位置,这是本题目的算法难点。

三、代码书写

#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;

vector <vector<int>> all;  //皇后插入位置序列的总记录

void DFS(vector<int> &queen,int pos){  //深度优先遍历算法,传入记录当前序列的的vector和当前插入的是第几个皇后
	for(int i=1;i<=8;i++){  //皇后从第1列开始插入,重复循环到第8列
		bool isok=true;  //设置布尔型变量,记录当前位置是否与已插入的皇后“冲突”
		for(int j=0;j<pos;j++){  //pos记录了当前是第几个皇后,这里是遍历之前插入的皇后
			if(queen[j]==i||pos-j==queen[j]-i||pos-j==i-queen[j]){  //检查是否同一行和同一斜线上
				isok=false;  //若冲突则置为false,退出检查
				break;
			}
		}
		if(isok==true){  //找到未冲突的位置
			queen.push_back(i);  //将当前的列数加入序列
			if(pos==7){  //若皇后数量达到8个,输出到总记录
				all.push_back(queen);  
			}else{
				DFS(queen,pos+1);  //皇后没到8个,则继续递归下去
			}
			queen.pop_back();  //重点!参数已传递到下层递归或总记录,这里应弹出刚刚尝试的列数,继续寻找其他可能的结果
		}
	}
}

int main(){
	vector<int> queen;   //记录当前序列
	DFS(queen,0); 
	//for(int j=0;j<all.size();j++){  这里注释的是输出所有的皇后序列,共92组,机试考试时可投机取巧,利用打表的手段降低时间空间复杂度
	//	for(int i=0;i<8;i++){
	//		printf("%d ",all[j][i]);
	//	}
	//	printf("\n");
	//}
	
	int n,num;
	scanf("%d",&n);  //题目要求输入n组数据
	for(int k=0;k<n;k++){
		scanf("%d",&num);  /题目要求每组数据代表第n组皇后序列
		
		for(int i=0;i<8;i++){
			printf("%d",all[num-1][i]);  //输出存放在总记录里的皇后序列
		}
		printf("\n");
		
	}

	return 0;
}

四、OJ检测

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值