PKU 3221-Diamond Puzzle

問題概要

問題文にある図のようなスライドパズル(0の部分が空)を解け。

解法

パターンは7!(=5040)しかないので最初にBFSして全ての解を求める

実装(C++)

#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;

int d[7][7]={
  {2,4,6,-1},
  {2,6,-1},
  {1,3,0,-1},
  {2,4,-1},
  {0,3,5,-1},
  {4,6,-1},
  {0,1,5,-1}
};

map<string,int> ans;

void bfs(){
  string start="0123456";
  ans[start]=0;
  queue<string> que;
  que.push(start);
  while(!que.empty()){
    string now=que.front();que.pop();
    int cost=ans[now];
    for(int i=0;i<7;i++){
      if(now[i]!='0')continue;
      for(int j=0;d[i][j]>=0;j++){
        swap(now[i],now[d[i][j]]);
        if(ans.count(now)==0||(ans[now]>cost+1)){
          ans[now]=cost+1;
          que.push(now);
        }
        swap(now[i],now[d[i][j]]);
      }
    }
  }
}
int main(){
  bfs();
  int n;
  cin>>n;
  string s;
  for(int i=0;i<n;i++){
    cin>>s;
    if(ans.count(s)==0){
      cout<<-1<<endl;
    }else{
     cout<<ans[s]<<endl;
    }
  }
}