八数码(BFS版本)

题目链接:https://www.luogu.com.cn/problem/P1379

题意:

求将初始状态转移至目标状态的最小步数(每次移动‘0’)

思路:

需要将每个状态记录在一个map表里,当出现新的状态时才将其加入,否则不加入(因为如果以前出现过,那么现在的状态肯定更劣)

将每个状态转化为字符串,位置x=pos/3,y=pos%3

然后上下左右能移动就移动记录

时间复杂度O(9!)

map<string,int>mp;
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
void bfs(string s,string k){
	queue<string>q;
	q.push(s);
	mp[s]=0;
	while(q.size()){
		string now=q.front();q.pop();
		if(now==k){
			cout<<mp[now]<<endl;
			break;
		}
		int step=mp[now];
		for(int i=0;i<4;i++){
			int pos=now.find("0");
			int x=pos/3,y=pos%3;
			int nx=x+dx[i],ny=y+dy[i];
			if(nx<0||nx>=3||ny<0||ny>=3)continue;
			swap(now[pos],now[nx*3+ny]);
			if(!mp.count(now)){
				mp[now]=step+1;
				q.push(now);
			}
			swap(now[pos],now[nx*3+ny]);
		}
	}
}
void solve(){
	string s;cin>>s;
	string k="123804765";
	bfs(s,k);	
}
posted @ 2025-03-14 16:56  Marinaco  阅读(18)  评论(0)    收藏  举报
//雪花飘落效果