广搜32MS,这题比较简单,进行各种变换推状态就行了
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
using namespace std;
typedef struct
{
int password[4]; //4位密码
int step; //步数
}pass;
int target[4]; //最终密码
int T;
string initpass;
string finalpass;
bool visited[10][10][10][10]; //标记
int BFS(pass init)
{
queue<pass> Q;
Q.push(init);
bool lock;
pass p;
while(!Q.empty())
{
p = Q.front();
Q.pop();
lock = true;
for(int i = 0; i < 4; i++) //结束条件
{
if(p.password[i] != target[i])
{
lock = false;
break;
}
}
if(lock)
{
return p.step;
}
for(int i = 0; i < 4; i++) //进行加操作
{
pass n;
n = p;
if(p.password[i] == 9)
{
n.password[i] = 1;
}
else
{
n.password[i] = p.password[i] + 1;
}
if(!visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]])
{
n.step = p.step + 1;
visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]] = true;
Q.push(n);
}
}
for(int i = 0; i < 4; i++) //进行减操作
{
pass n;
n = p;
if(p.password[i] == 1)
{
n.password[i] = 9;
}
else
{
n.password[i] = p.password[i] - 1;
}
if(!visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]])
{
n.step = p.step + 1;
visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]] = true;
Q.push(n);
}
}
for(int i = 0; i < 3; i++) //互换操作
{
pass n;
n = p;
n.password[i] = p.password[i+1];
n.password[i+1] = p.password[i];
if(!visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]])
{
n.step = p.step + 1;
visited[n.password[0]][n.password[1]][n.password[2]][n.password[3]] = true;
Q.push(n);
}
}
}
return -1;
}
int main()
{
cin>>T;
while(T--)
{
cin>>initpass;
cin>>finalpass;
pass first;
for(int i = 0; i < 4; i++) //将字符转化成数字
{
first.password[i] = initpass[i] - '0';
target[i] = finalpass[i] - '0';
}
first.step = 0;
memset(visited,0,sizeof(visited));
int s = BFS(first);
cout<<s<<endl;
}
return 0;
}
hdu 1195 BFS
最新推荐文章于 2024-10-10 08:47:47 发布
本文介绍了一个简单的广搜(BFS)算法实例,通过变换密码状态来寻找从初始密码到达目标密码所需的最少步骤。采用队列实现广搜过程,并利用标记数组避免重复搜索已访问的状态。

260

被折叠的 条评论
为什么被折叠?



