八数码(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);
}

浙公网安备 33010602011771号