搜索就三种规则, 一个是+1 一个是-1 还有一个是交换,用bfs搜索就行了,参照大神的思路。。。
代码:
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int a[5];
int b[5];
struct Node
{
int di[5];
int st;
};
int v[10][10][10][10];
void bfs()
{
queue<Node> q;
Node f;
for(int i = 0; i < 4; ++i)
f.di[i] = a[i];
f.st = 0;
q.push(f);
while(!q.empty())
{
Node t = q.front();
q.pop();
int flag = 1;
for(int i = 0; i < 4; ++i)
{
if(t.di[i] != b[i])
{
flag = 0;
break;
}
}
if(flag)
{
printf("%d\n",t.st);
return ;
}
Node p ;
for(int i = 0; i < 4; ++i) // +1
{
p = t;
if(p.di[i] == 9)
p.di[i] = 1;
else p.di[i]++;
p.st = t.st + 1;
if(!v[p.di[0]][p.di[1]][p.di[2]][p.di[3]])
{
v[p.di[0]][p.di[1]][p.di[2]][p.di[3]] = 1;
q.push(p);
}
}
for(int i = 0; i < 4; ++i) // -1
{
p = t;
if(p.di[i] == 1)
p.di[i] = 9;
else
p.di[i]--;
p.st = t.st + 1;
if(!v[p.di[0]][p.di[1]][p.di[2]][p.di[3]])
{
v[p.di[0]][p.di[1]][p.di[2]][p.di[3]] = 1;
q.push(p);
}
}
for(int i = 0; i < 3; ++i) //交换
{
p = t;
p.di[i] = t.di[i + 1];
p.di[i + 1] = t.di[i];
p.st = t.st + 1;
if(!v[p.di[0]][p.di[1]][p.di[2]][p.di[3]])
{
v[p.di[0]][p.di[1]][p.di[2]][p.di[3]] = 1;
q.push(p);
}
}
}
}
int main()
{
int _;
scanf("%d",&_);
while(_--)
{
memset(v,0,sizeof(v));
char s[10],s1[10];
scanf("%s",s);
for(int i = 0;i < 4;++i)
a[i] = s[i] - '0';
scanf("%s",s1);
for(int i = 0; i < 4; ++i)
b[i] = s1[i] - '0';
bfs();
}
}