密码锁

题目:
在这里插入图片描述
代码如下:

#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。可能我写的比较繁琐,应该还能更简洁。

猜你喜欢

转载自blog.csdn.net/qq_41998938/article/details/87878948