蓝桥练1
分考场
搜索
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int n,m;
int vis[101][101];
int a[101][101];
int ans=100;
void dfs(int ca,int id){
if(ca>=ans)return;
if(id>n){
ans=min(ans,ca);
return;
}
int i,capos;
for(i=1;i<=ca;i++){
int capos=1;
while(a[i][capos]&&!vis[id][a[i][capos]])capos++;
if(a[i][capos]==0){
a[i][capos]=id;
dfs(ca,id+1);
a[i][capos]=0;
}
}
a[ca+1][1]=id;
dfs(ca+1,id+1);
a[ca+1][1]=0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
vis[a][b]=1;
vis[b][a]=1;
}
dfs(1,1);
cout<<ans;
return 0;
}
青蛙跳杯子
bfs
点击查看代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 2e5 + 9, inf = 8e18;
//一开始我还寻思着怎么会用到bfs呢,原来和深搜不一样,广搜在做这类模板题时直接跑出了最优解
//需要注意的是题面上是老鼠在跳,其实实际过程中就是杯子和老鼠在交换位置
//这时我们发现其实就只是杯子的位置在遍历搜索,所有广搜直接遍历出最优解返回了
//但map存的就不是我所理解的只会出现一种答案,而是遍历步数的过程
//纯板子题
string a, b;
int n, d[6] = {-1,1,2,-2,3,-3};
map<string,int> mp;//注意每种情况都是一种结果,但是我们广搜直接出了最优解,所以用string标记整个字符串
void bfs()
{
queue<string> q;
q.push(a);
//mp[a] = 0;无需初始化
while(q.size())
{
string ss = q.front();
q.pop();
int cnt = mp[ss];
int x = ss.find('*');//找到杯子的位置
for(int i = 0; i < 6; i ++)
{
int dx = x + d[i];
if(dx >= 0 && dx < n)
{
swap(ss[dx],ss[x]);//破案了,我是个sb,遍历的是队头元素,对队头元素进行操作
if(!mp.count(ss))
{
mp[ss] = cnt + 1;
if(ss == b)
{
cout << mp[ss] << '\n';
return;
}
q.push(ss);//入队此种情况后,再进行还原,保证走的每一步都入队,方便后续入队
}
swap(ss[dx],ss[x]);
}
}
}
}
void solve()
{
cin >> a >> b;
n = a.size();
bfs();
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _= 1;
//cin >> _;
while(_ --)
{
solve();
}
return 0;
}