试题 算法提高 八数码(bfs)

问题描述
  RXY八数码
输入格式
  输入两个3*3表格
  第一个为目标表格
  第二个为检索表格
输出格式
  输出步数
样例输入
1 2 3
4 5 6
7 8 0
1 2 3
4 5 6
7 0 8
样例输出
1
数据规模和约定
  3*3*2
思路
经典搜索问题,记录九个格子为空格时可以交换的格子,bfs注意开一个临时变量进行交换,得到目标情形跳出即可。
#include<bits/stdc++.h>
using namespace std;
int dir[9]={2,3,2,3,4,3,2,3,2};
int dis[9][4]={{1,3},{0,2,4},{1,5},{0,4,6},{1,3,5,7},{2,4,8},{3,7},
{4,6,8},{5,7}};
int getpos(string a){
    for(int i=0;i<a.size();i++){
        if(a[i]=='0')return i;
    }
}
int main(){
    string a,b;
    int temp;
    string a1[9],a2[9];
    for(int i=0;i<9;i++){///处理一下输入string遇回车结束
        cin>>a1[i];
        a+=a1[i];
    }
    for(int i=0;i<9;i++){
        cin>>a2[i];
        b+=a2[i];
    }
    queue<pair<string,int> >q;///存储字符串和步数
    q.push(make_pair(a,0));
    while(!q.empty()){
        string str=q.front().first;
        int step=q.front().second;
        q.pop();
        int pos=getpos(str);///得到空格的位置
        if(str==b){
            cout<<step<<endl;
            break;
        }
        for(int i=0;i<dir[pos];i++){
            string temp=str;
            swap(temp[pos],temp[dis[pos][i]]);
            q.push(make_pair(temp,step+1));
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/mohari/p/13584128.html