计蒜客:密码锁---bfs

计蒜客:密码锁—bfs

题目描述:

现在一个紧急的任务是打开一个密码锁。密码由四位数字组成,每个数字从1到9进行编号。每次可以对任何一位数字加1或减1.当将9加1时,数字变为1,当1减1时,数字变为9.还可以交换相邻的数字,每一个行动记做一步。求最少步骤打开密码锁。
输入格式:
第一行输入四位数字,表示密码锁的初始状态
第二行输入四位数字,表示开锁的密码。
输出格式:
输出一个整数,即最小步骤数。
样例输入:
1234
2144
样例输出:
2

解题思路:
广搜。
将锁的位置看做是四维的一个座标系。和迷宫的操作依然差不多,这样就没有很大的难度了,只不过添加了一些操作。本质上也没怎么变化。

AC代码:

//密码锁 
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <vector>
using namespace std;
struct node
{
	int num[4];
	int step;
}first,last;
int vis[10][10][10][10];
int bfs()
{
	int temp1,temp2,i,j; 
	node a,next;
	a=first;
	a.step=0;
	//首元素进队
	queue<node>q;
	q.push(a);
	//标记首元素
	vis[a.num[0]][a.num[1]][a.num[2]][a.num[3]]=1;
	while(!q.empty())
	{
		a=q.front();
		q.pop();
		//退出条件 
		if(a.num[0]==last.num[0]&&a.num[1]==last.num[1]&&a.num[2]==last.num[2]&&a.num[3]==last.num[3])
			return a.step;
		//+1操作
		for(int i=0;i<4;i++)
		{
			next=a;
			next.num[i]++;
			if(next.num[i]==10)
			{
				next.num[i]=1;
			}
			if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
			{
				vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
				next.step++;
				q.push(next);
			}
		}
		//-1操作
		for(int i=0;i<4;i++)
		{
			next=a;
			next.num[i]--;
			if(next.num[i]==0)
			{
				next.num[i]=9;
			}
			if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
			{
				vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
				next.step++;
				q.push(next);
			}
		}
		//交换 ,其实两边都交换的话,必然重复,所以这里可以仅仅和右边的数交换 
		for(int i=0;i<3;i++) 
		{
			next=a;
			next.num[i]=a.num[i+1];
			next.num[i+1]=a.num[i];
			if(!vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]])
			{
				vis[next.num[0]][next.num[1]][next.num[2]][next.num[3]]=1;
				next.step++;
				q.push(next);
			}
		}
	} 
}
int main()
{
	//每个数字有3个状态:1、加一 2、减一  3、与右边相邻交换 
	//当将9加1时,数字变为1,当1减1时,数字变为9.还可以交换相邻的数字,每一个行动记做一步
	int i;
	char str1[5],str2[5];
	cin>>str1>>str2;
	for(i=0;i<strlen(str1);i++)
	{
		first.num[i]=str1[i]-'0';
		last.num[i]=str2[i]-'0';
	}
	int ans=bfs();
	cout<<ans<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章