没有合适的资源?快使用搜索试试~ 我知道了~
深度优先搜索应用.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 184 浏览量
2021-11-23
12:41:39
上传
评论
收藏 336KB DOCX 举报
温馨提示
试读
28页
深度优先搜索应用
资源推荐
资源详情
资源评论
深度优先搜索应用
例题 1:字母排列(主题库 2698)
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
我们假设对于小写字母有 'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。
输入格式
输入有多组数据,每行一组,每组数据是一个由小写字母组成的字符串,已知字符串的长度在 1 到 6 之间。
输出格式
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字典序如下定义:
已知 S = s_1s_2...s_k , T = t_1t_2...t_kS=s1s2...sk,T=t1t2...tk,则 S < TS<T 等价于,存在 p (1 <= p <= k)p(1<=p<=k),使得 s_1 =
t_1, s_2 = t_2, ..., s_{p - 1} = t_{p - 1}, s_p < t_ps1=t1,s2=t2,...,sp−1=tp−1,sp<tp 成立。
注意每组样例输出结束后接一个空行。
样例输入
xyz
Copy
样例输出
xyz
xzy
yxz
yzx
zxy
zyx
Copy
解题思路:详细解题思路见代码解析。
#include<bits/stdc++.h>
using namespace std;
char a[10];
int n,use[10];
string s;
void print()
{
for(int i=1;i<=n;i++)
{
cout<<a[i];
}
cout<<endl;
}
void dfs(int cur)
//当前位置
{
if(cur>n)
//当前位置大于 n,结束
{
print();
//输出该种排列
return;
}
for(int i=0;i<=n-1;i++)
//枚举第 cur 个元素的值
{
if(use[i]==0)
//i 没有被前面的元素使用
{
a[cur]=s[i];
//记录元素值
use[i]=1;
//标记 i 被使用
dfs(cur+1);
//搜索下一个元素的值
use[i]=0;
//使用完,恢复状态
}
}
}
int main()
{
while(cin>>s)
{
n=s.size();
dfs(1);
//从第一个位置开始排
cout<<endl;
}
return 0;
}
Copy
例题 2:N 皇后问题(主题库 1285)
要在国际象棋棋盘中放 n 个皇后(棋盘大小为 n*n),使任意两个皇后都不能互相吃。(提示:皇后能吃同一行、同一列、同一对角线
的任意棋子。)
解题思路:详细解题思路见代码解析。
#include<bits/stdc++.h>
using namespace std;
int a[10];
//记录第 i 行的皇后放在第几列
int n,ans=0;
bool check(int row,int col){
//判断第 row 行的皇后摆在第 col 列行不行
for(int i=1;i<row;i++)
//i 表示行号,a[i]表示列号
{
if(a[i]==col||(abs(row-i)==abs(col-a[i])))
//如果列号已经存
在或者在斜对角线上,行的变化值等于列的变化值
return false;
}
return true;
}
void dfs(int cur)
{
if(cur>n){
//从上往下摆,摆到第 n+1 行结束,即到达目的地
ans++;
//摆法++
for(int i=1;i<=n;i++)
//具体摆法
{
cout<<setw(5)<<a[i];
//i 表示行号,a[i]表示列号,输出列
号,即具体摆法
}
cout<<endl;
return;
//void 类型函数,return 不加返回值表示函数结束
}
for(int i=1;i<=n;i++)
//如果没有到第 n+1 行,就需要从一列摆到第 n
列,同时要判断该列能不能摆
{
if(check(cur,i)==true)
//cur 代表行,i 代表列,表示该位置可以
摆
{
a[cur]=i;
//第 cur 行的皇后放在第 i 列
dfs(cur+1);
//开始搜索下一行
}
}
}
int main()
{
cin>>n;
dfs(1);
//从第一行开始
if(ans==0)
cout<<"no solute!";
return 0;
}
Copy
例题 3:八皇后问题
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将 8 个皇后放在棋盘上(有 8 × 8 个方格),
使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的 8 皇后的摆放方法,定义一个皇后串 a 与之对应,即 a=b1b2...b8,其中 bi 为相应摆法中第 i 行皇后所处的列数。
已经知道 8 皇后问题一共有 92 组解(即 92 个不同的皇后串)。
给出一个数 b,要求输出第 b 个串。串的比较是这样的:皇后串 x 置于皇后串 y 之前,当且仅当将 x 视为整数时比 y 小。
输入格式:第 1 行是测试数据的组数 n,后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整数 b(1≤b≤92)。
输出格式:输出有 n 行,每行输出对应一个输入。输出应是一个正整数,是对应于 b 的皇后串。
输入样例 1:
2
1
92
Copy
输出样例 1:
15863724
84136275
Copy
解题思路:详细解题思路见代码解析。
剩余27页未读,继续阅读
资源评论
10247D
- 粉丝: 957
- 资源: 111
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功