题解:
可以BFS+Hash判重,但是本蒟蒻还是把此题当做迭代加深的模板题来做。
所谓迭代加深就是指每次限定一个迭代深度,到达这一层就返回,如果找不到解再扩大限制重复搜索直到搜到解,否则直接返回答案。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char s[5][5];
int sx[2],sy[2],cnt=0,ans;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
inline void swap(char &x,char &y) {x^=y^=x^=y;}
inline bool cck() {
for (int i=1;i<=4;++i) {
if (s[i][1]==s[i][2]&&s[i][2]==s[i][3]&&s[i][3]==s[i][4]) return true;
if (s[1][i]==s[2][i]&&s[2][i]==s[3][i]&&s[3][i]==s[4][i]) return true;
}
if (s[1][1]==s[2][2]&&s[2][2]==s[3][3]&&s[3][3]==s[4][4]) return true;
if (s[1][4]==s[2][3]&&s[2][3]==s[3][2]&&s[3][2]==s[4][1]) return true;
return false;
}
inline bool in(int x,int y,char c) {
return x>0&&x<5&&y>0&&y<5&&s[x][y]^c;
}
bool IDDFS(int x1,int y1,int x2,int y2,char cur,int step) {
if (step==ans) return cck();
for (int i=0;i<4;++i) {
int ax=x1+dx[i],ay=y1+dy[i],bx=x2+dx[i],by=y2+dy[i];
if (in(ax,ay,cur)) {
swap(s[ax][ay],s[x1][y1]);
if (IDDFS(ax,ay,x2,y2,cur=='B'?'W':'B',step+1)) return true;
swap(s[ax][ay],s[x1][y1]);
}
if (in(bx,by,cur)) {
swap(s[bx][by],s[x2][y2]);
if (IDDFS(x1,y1,bx,by,cur=='B'?'W':'B',step+1)) return true;
swap(s[bx][by],s[x2][y2]);
}
}
return false;
}
int main() {
// freopen("P2346.in","r",stdin);
for (int i=1;i<=4;++i) {
scanf("%s",s[i]+1);
for (int j=1;j<=4;++j)
if (s[i][j]=='O') sx[cnt]=i,sy[cnt]=j,++cnt;
}
for (ans=1;ans<=0x3f3f3f3f;++ans) {
if (IDDFS(sx[0],sy[0],sx[1],sy[1],'B',0)) {printf("%d\n",ans);return 0;}
if (IDDFS(sx[0],sy[0],sx[1],sy[1],'W',0)) {printf("%d\n",ans);return 0;}
}
}