1.原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=1195
2.基本题意:
给定四位数字,要求将原数字做一定的变换操作得到解锁密码。可以进行的操作有:1、对每一位数进行加以1操作(注意:9+1=0)。2、对每一位数字进行减1操作(注意:0-1=9)。3、交换相邻两个数的位置。(注意:最左边的数与最右边的数不是相邻关系。)
问最少要经过多少次操作可以成功得到解锁密码。
3.程序源代码
#include<iostream>
#include<queue>
#include<memory.h>
#include<stdio.h>
using namespace std;
int visited[10][10][10][10];
struct node
{
int num[4];
int step;
}start,end,current,next;
bool OpenLock(node a,node b)
{
for(int i=0;i<4;i++)
{
if(a.num[i]!=b.num[i])
return false;
}
return true;
}
int BFS()
{
queue<node> Q;
int i;
start.step=0;
visited[start.num[0]][start.num[1]][start.num[2]][start.num[3]]=1;
Q.push(start);
while(!Q.empty())
{
current=Q.front();
Q.pop();
if(OpenLock(current,end))//如果temp和解锁密码相同,则返回操作步数
{
return current.step;
}
//对每一位试探性加1操作
for(i=0;i<4;i++)
{
next=current;//这一步必不可少啊,只有先赋值了才有元素加减交换操作
if(current.num[i]==9)
next.num[i]=1;
else
next.num[i]=current.num[i]+1;
if(!visited[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
{
visited[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
next.step=current.step+1;
Q.push(next);
}
}
//对每一位试探性减1操作
for(i=0;i<4;i++)
{
next=current;
if(current.num[i]==1)
next.num[i]=9;
else
next.num[i]=current.num[i]-1;
if(!visited[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
{
visited[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
next.step=current.step+1;
Q.push(next);
}
}
//对每一位试探性交换操作
for(i=0;i<3;i++)
{
next=current;
next.num[i]=current.num[i+1];
next.num[i+1]=current.num[i];
if(!visited[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
{
visited[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
next.step=current.step+1;
Q.push(next);
}
}
}
return -1;
}
int main()
{
int caseNum;
char a[4],b[4];//字符型数组,用于初始输入
int i;
cin>>caseNum;
getchar();
while(caseNum--)
{
memset(visited,0,sizeof(visited));
//注:此题必须要用 char型数组输入测试数据,因为数字之间没有空格,int n[4]一起输入会被当成一个 int 型数字
//输入字符型数组,并将其转为int型
for(i=0;i<4;i++)
{
cin>>a[i];
start.num[i]=a[i]-'0';
}
for(i=0;i<4;i++)
{
cin>>b[i];
end.num[i]=b[i]-'0';
}
cout<<BFS()<<endl;
}
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/163062.html