Official
I - 入れ替えパズル/Swap Puzzle Editorial
by
I - 入れ替えパズル/Swap Puzzle Editorial
by
kyopro_friends
この問題はBFSにより解くことができます。
グリッドの数字の並びを状態とします。
実装例(C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>a(8);
for(int i=0;i<8;i++)cin >> a[i];
map<vector<int>,int>memo;
queue<vector<int>>q;
memo[a]=0;
q.push(a);
while(!q.empty()){
vector<int>a=q.front();
q.pop();
int crr=memo[a];
//左右swap
for(int i=0;i<7;i++){
if(i==3)continue;
swap(a[i],a[i+1]);
if(memo.find(a)==memo.end()){
memo[a]=crr+1;
q.push(a);
}
swap(a[i],a[i+1]);
}
//上下swap
for(int i=0;i<4;i++){
swap(a[i],a[i+4]);
if(memo.find(a)==memo.end()){
memo[a]=crr+1;
q.push(a);
}
swap(a[i],a[i+4]);
}
}
cout << memo[{1,2,3,4,5,6,7,8}] << endl;
}
実装例(Python)
a=list(map(int,input().split()))+list(map(int,input().split()))
memo={}
q=[]
memo[tuple(a)]=0
q.append(tuple(a))
for a in q:
crr=memo[a]
a=list(a)
# 左右swap
for i in range(7):
if i==3: continue
a[i],a[i+1]=a[i+1],a[i]
if tuple(a) not in memo:
memo[tuple(a)]=crr+1
q.append(tuple(a))
a[i],a[i+1]=a[i+1],a[i]
# 上下swap
for i in range(4):
a[i],a[i+4]=a[i+4],a[i]
if tuple(a) not in memo:
memo[tuple(a)]=crr+1
q.append(tuple(a))
a[i],a[i+4]=a[i+4],a[i]
print(memo[(1,2,3,4,5,6,7,8)])
posted:
last update:
