#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int num[4];
int step;
}node;
node queue[10000]={};
int head,tail;
bool vis[10][10][10][10];
int ansnum[4];
//int ans;
void enqueue(node E){
queue[tail++] = E;
}
node dequeue(){
return queue[head++];
}
void init()
{
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
for(int m=0;m<10;m++){
for(int n=0;n<10;n++){
vis[i][j][m][n] = false;
}
}
}
}
}
bool istrue(node x)
{
if (x.num[0] == ansnum[0] && x.num[1] == ansnum[1] && x.num[2] == ansnum[2] && x.num[3] == ansnum[3])
return true;
return false;
}
bool judge(node x)
{
if (vis[x.num[0]][x.num[1]][x.num[2]][x.num[3]]) return false;
return true;
}
node change(node a, int b)
{
a.step+1;
if (b < 4) // +
{
if (a.num[b] == 9) a.num[b] = 1;
else a.num[b]++;
}
else if (b < 8) // -
{
if (a.num[b%4] == 1) a.num[b%4] = 9;
else a.num[b%4] = a.num[b%4] - 1;
}
else // 换
{
int tmp;
b %= 4;
tmp = a.num[b];
a.num[b] = a.num[b+1];
a.num[b+1] = tmp;
}
return a;
}
int main()
{
int T,a,b;
freopen("input.txt","r",stdin);
scanf("%d", &T);
while (T--)
{
head=0;
tail=0;
int ans=0;
init();
node now = {};
scanf("%d %d", &a, &b);
for (int i=3; i>=0; i--)
{
ansnum[i] = a % 10;
now.num[i] = b % 10;
a /= 10;
b /= 10;
}
now.step = 0;
enqueue(now);
vis[now.num[0]][now.num[1]][now.num[2]][now.num[3]] = true;
node Curpoint = {};
node NewPoint = {};
while(head<tail){
Curpoint = dequeue();
if (istrue(Curpoint))
{
ans = Curpoint.step;
break;
}
for (int i = 0; i < 11; i++)
{
NewPoint = change(Curpoint, i);
if (judge(NewPoint))
{
vis[NewPoint.num[0]][NewPoint.num[1]][NewPoint.num[2]][NewPoint.num[3]] = true;
NewPoint.step = Curpoint.step+1;
enqueue(NewPoint);
}
}
}
printf("%d\n", ans);
}
}
HDU 1195 Problem:OPEN THE LOCK (bfs)
最新推荐文章于 2022-12-07 14:44:37 发布