全部输出0,双向广搜求条
查看原帖
全部输出0,双向广搜求条
1392708
wangzichen20240101楼主2025/7/27 10:05
#include<bits/stdc++.h>
using namespace std;
string s1,en,st;
map<string,int> vis;
map<string,int> dis;
queue<string> q1,q2;
int dx[] = {0,-1,0,1},dy[] = {1,0,-1,0};
int addd(queue<string> & q,int mk){
	string p = q.front();
	q.pop();
	for(int i = 0;i < 16;++i){
		if(p[i] == '0') continue;
		int px = i / 4,py = i % 4;
		for(int j = 0;j < 4;++j){
			int nx = dx[j] + px;
			int ny = dy[j] + py;
			if(nx >= 0 && nx < 4 && ny >= 0 && ny < 4){
				string s2 = p;
				swap(s2[nx * 4 + ny],s2[i]);
				if(s2[nx * 4 + ny] == '1') continue;
				if(vis[s2] == 0){
					vis[s2] = mk;
					dis[s2] = dis[p] + 1;
					q.push(s2);
				}
				else{
					if(vis[s2] != mk){
						return dis[s2] + dis[p] + 1;
					}
				}
			}
		}
	}
	return -1;
}
int bfs(){
	q1.push(st);
	q2.push(en);
	vis[st] = 1;
	vis[en] = -1;
	while(!q1.empty() && !q2.empty()){
		int res = q1.size() > q2.size() ? addd(q2,-1) : addd(q1,1);
		if(res != -1) return res;
	}
    return 0;
}
int main(){
	for(int i = 0;i < 4;++i){
		cin >> s1;
		st += s1;
	}
	for(int i = 0;i < 4;++i){
		cin >> s1;
		en += s1;
	}
	cout << bfs();
	return 0;
}
2025/7/27 10:05
加载中...