题意:第一行代表密码锁的初始状态,第二行代表解锁密码,可以通过上下翻滚,或者相邻的交换获得解锁密码,问最少经过几次可以解锁!
思路1:bfs:一共就4个数字,每个数字上下翻滚一共8种状态,再加上相邻的交换的话是3种状态,总共8+3种状态!
然后从开始的初始状态,进行13种状态转换,每种都入队,下次出队后再进行13种状态转换,直到找到解锁密码即为最少次数!
代码:
#include <iostream>
#include <queue>
#include <string.h>
#include <algorithm>
using namespace std;
struct node{
int sock[4];//当前锁
int steps;//次数
};
int start[4],visit[10][10][10][10],a,b;
queue<node>Q;
int bfs()
{
while(!Q.empty())Q.pop();
node temp;
for(int i=0;i<4;i++)temp.sock[i] = start[i];//将初始密码入队
temp.steps = 0;
Q.push(temp);
while(!Q.empty())
{
node pre =