DFS迭代加深 思路与第一篇题解类似(代码也很像)
但是WA on #1 #2 #4 TLE on #5
看了讨论区的警钟好像都没说到我的问题上,dalao提供的几个好人数据也过了,不知道问题出在哪里
#include<bits/stdc++.h>
using namespace std;
int mp[5][5],ans=0;
int dx[5]={-1,0,0,1},dy[5]={0,-1,1,0};
bool check(){
for(int i=1;i<=4;i++){
if(mp[i][1]==mp[i][2]&&mp[i][2]==mp[i][3]&&mp[i][3]==mp[i][4]) return 1;
if(mp[1][i]==mp[2][i]&&mp[2][i]==mp[3][i]&&mp[3][i]==mp[4][i]) return 1;
}
if(mp[1][1]==mp[2][2]&&mp[2][2]==mp[3][3]&&mp[3][3]==mp[4][4]) return 1;
if(mp[1][4]==mp[2][3]&&mp[2][3]==mp[3][2]&&mp[3][2]==mp[4][1]) return 1;
return 0;
}
bool dfs(int op,int col,int x1,int y1,int x2,int y2){ // op即当前操作轮数
if(op>ans){
if(check()) return 1;
return 0;
}
// 搜索第一个空
for(int i=0;i<4;i++){
int xx=x1+dx[i],yy=y1+dy[i];
if(xx>=1&&xx<=4&&yy>=1&&yy<=4&&mp[xx][yy]==col){
swap(mp[x1][y1],mp[xx][yy]);
if(dfs(op+1,3-col,xx,yy,x2,y2)) return 1;
swap(mp[x1][y1],mp[xx][yy]);
}
}
// 搜索第二个空
for(int i=0;i<4;i++){
int xx=x2+dx[i],yy=y2+dy[i];
if(xx>=1&&xx<=4&&yy>=1&&yy<=4&&mp[xx][yy]==col){
swap(mp[x2][y2],mp[xx][yy]);
if(dfs(op+1,3-col,x1,y1,xx,yy)) return 1;
swap(mp[x2][y2],mp[xx][yy]);
}
}
return 0;
}
int main(){
// 读入地图
int sx1,sy1,sx2,sy2;
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
char c;
cin>>c;
if(c=='B') mp[i][j]=1; // 1为黑
else if(c=='W') mp[i][j]=2; // 2为白
else mp[i][j]=0; // 0为空
if(mp[i][j]==0&&sx1==0) sx1=i,sy1=j;
else if(mp[i][j]==0) sx2=i,sy2=j;
}
}
// 逐步增大搜索深度ans
while(++ans){
if(dfs(1,1,sx1,sy1,sx2,sy2)) break; // 黑方先走
if(dfs(1,2,sx1,sy1,sx2,sy2)) break; // 白方先走
}
cout<<ans;
return 0;
}