/*
author:snowflake
time:2012.5.10
desc:bfs搜索暴力求解
*/
/*此题求解开锁的最优解,那就用BFS来求解吧*/
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
typedef struct
{
int n[4], step;
}Node;
int final[4];//开锁时的四个号码
bool mark[10][10][10][10];//访问状态用
int bfs(Node q)
{
int i;
Node p, k;
bool lock;
queue<Node> Q;
Q.push(q);
while(!Q.empty())
{
p = Q.front();
Q.pop();
lock = true;
//判断是否可以开锁
for(i = 0; i < 4; i++)
{
if(p.n[i] != final[i])
{
lock = false;
break;
}
}
if(lock)
return p.step;
//每一位试探加1操作
for(i = 0; i < 4; i++)
{
k = p;
if(p.n[i] == 9)
k.n[i] = 1;
else
k.n[i] = p.n[i] + 1;
if(!mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]])
{
mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]] = true;
k.step = p.step + 1;
Q.push(k);
}
}
//每一位试探减1操作
for(i = 0; i < 4; i++)
{
k = p;
if(p.n[i] == 1)
k.n[i] = 9;
else
k.n[i] = p.n[i] - 1;
if(!mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]])
{
mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]] = true;
k.step = p.step + 1;
Q.push(k);
}
}
//相邻交换
for(i = 0; i < 3; i++)
{
k = p;
k.n[i] = p.n[i + 1];
k.n[i + 1] = p.n[i];
if(!mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]])
{
mark[k.n[0]][k.n[1]][k.n[2]][k.n[3]] = true;
k.step = p.step + 1;
Q.push(k);
}
}
}
return -1;//这里没什么用,肯定可以开锁,执行不到这里,就是为了没有waring
}
int main()
{
int i, t;
Node p;
char status[2][4];
scanf("%d",&t);
while(t--)
{
//当作字符串输入
scanf("%s",&status[0]);
scanf("%s",&status[1]);
//把字符串转型
for(i = 0; i < 4; i++)
{
p.n[i] = status[0][i]-'0';
final[i] = status[1][i] - '0';
}
p.step = 0;
memset(mark, false, sizeof(mark));//初始化访问状态
int s = bfs(p);
printf("%d\n",s);
}
return 0;
}
hdu1195 Open the Lock
最新推荐文章于 2018-02-21 19:09:04 发布