dfs 永远的神,我这个垃圾也写过了,无比开心
状态表示这次很简洁 直接u来转化x,y
算法
深度优先搜索
d就完了
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 18;
typedef long long ll;
ll ans=10001010;
char g[N][N];
int dx[18],dy[19],d1[18],d2[18];
int goo(int x,int y){
for(int i=0;i<4;i++){
if(g[x][i]=='+') g[x][i] = '-';
else if(g[x][i]=='-') g[x][i] = '+';
}
for(int i=0;i<4;i++){
if(g[i][y]=='+') g[i][y] = '-';
else if(g[i][y]=='-') g[i][y] = '+';
}
if(g[x][y]=='-')g[x][y]='+';
else if(g[x][y]=='+') g[x][y]= '-';
return 0;
}
int decis(){
int f=1;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
if(g[i][j]=='+') {return 0;}
}
return 1;
}
void dfs(int u,ll k){
if(decis()) {
ans = min(ans,k);
memcpy(d1,dx,sizeof dx);
memcpy(d2,dy,sizeof dx);
return;
}
if(u==16){
return ;
}
int x= u/4, y=u%4;
goo(x,y);
dx[k] = x, dy[k] =y;
dfs(u+1,k+1);
goo(x,y);
dfs(u+1,k);
}
int main(){
for(int i=0;i<4;i++) cin>>g[i];
dfs(0,0);
cout<<ans<<endl;
for(int i=0;i<ans;i++) cout<<d1[i]+1<<' '<<d2[i]+1<<endl;
}