题目:
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,tx,a[4],vis[10005];
struct Point
{
int x,step;
Point() {}
Point(int xx,int step2):x(xx),step(step2) {}
}point;
int bfs(int n,int m)
{
queue<Point> q;
point = Point(n,0);
q.push(point);
while(!q.empty()){
point = q.front();
q.pop();
//cout << point.x << " " << point.step << endl;;
if(point.x == m) return point.step;
a[0] = point.x % 10;
a[1] = point.x / 10 % 10;
a[2] = point.x / 100 % 10;
a[3] = point.x / 1000;
for(int i = 0;i < 4;i++){
a[i]++;
if(a[i] == 10) a[i] = 1;
tx = a[3] * 1000 + 100 * a[2] + 10 * a[1] + a[0];
if(!vis[tx]){
vis[tx] = true;
q.push(Point(tx,point.step + 1));
}
a[0] = point.x % 10;
a[1] = point.x / 10 % 10;
a[2] = point.x / 100 % 10;
a[3] = point.x / 1000;
}
for(int i = 0;i < 4;i++){
a[i]--;
if(a[i] == 0) a[i] = 9;
tx = a[3] * 1000 + 100 * a[2] + 10 * a[1] + a[0];
if(!vis[tx]){
vis[tx] = true;
q.push(Point(tx,point.step + 1));
}
a[0] = point.x % 10;
a[1] = point.x / 10 % 10;
a[2] = point.x / 100 % 10;
a[3] = point.x / 1000;
}
tx = a[2] * 1000 + 100 * a[3] + 10 * a[1] + a[0];
if(!vis[tx]){
vis[tx] = true;
q.push(Point(tx,point.step + 1));
}
tx = a[3] * 1000 + 100 * a[1] + 10 * a[2] + a[0];
if(!vis[tx]){
vis[tx] = true;
q.push(Point(tx,point.step + 1));
}
tx = a[3] * 1000 + 100 * a[2] + 10 * a[0] + a[1];
if(!vis[tx]){
vis[tx] = true;
q.push(Point(tx,point.step + 1));
}
}
return -1;
}
int main()
{
cin >> n >> m;
cout << bfs(n,m) << endl;
return 0;
}
一道简单的bfs题,就是操作的步骤比较繁琐,只需注意9进一位是到1,1退一位是回9。可能我写的比较繁琐,应该还能更简洁。