Aoj-0121 Seven Puzzle

版权声明:最后一年,加油~ https://blog.csdn.net/zzti_xiaowei/article/details/81779294

[题目链接]

思路:

  • 反向搜索bfs,预处理每个状态结果,如果对每个数据进行bfs,会T掉。
  • queue< P>记录状态和0的位置。
  • map< string,int> 记录已经搜索到的状态和步数,同时会可以判断此状态是否已入列 < 真的好难想啊啊啊啊~~~>。
  • 还有可好奇gets会CE,cin.getline会TLE,搞不懂,好气哦~

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
typedef pair<string,int>P;

string str="01234567"; 
int dir[4]={1,-1,4,-4};
map<string,int>m;  //状态所对应步数 
queue<P>que;

bool jud(int f,int i){
    if(f+dir[i]<0||f+dir[i]>7)return false;
    if(f==3&&i==0)return false;
    if(f==4&&i==1)return false;
    return true;
}

void bfs(){
    que.push(P(str,0));
    m[str]=0;
    while(!que.empty()){
        P p=que.front();
        que.pop();
        for(int i=0;i<4;i++){
            int f=p.second;
            string s=p.first;
            if(jud(f,i)){
                int step=m[s];
                swap(s[f],s[f+dir[i]]);
                if(!m.count(s)){
                    m[s]=step+1;
                    que.push(P(s,f+dir[i]));
                }
            }
        }
    }

} 


int main()
{
    bfs();
    string line;
    while (getline(cin, line))
    {
        line.erase(remove(line.begin(), line.end(), ' '), line.end());
        cout << m[line] << endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzti_xiaowei/article/details/81779294