AcWing 116. 飞行员兄弟 为啥我的跑800ms,这么快
原题链接
简单
作者:
马扎特
,
2020-09-28 13:41:04
,
所有人可见
,
阅读 1251
(DFS) 800ms,不懂为啥这么快
C++ 代码
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
PII ans[20],cur[20];
char c[6][6];
int sum;
void turn(int x,int y)
{ for(int i=0;i<4;i++)
{
if(c[i][y]=='+') c[i][y]='-';
else c[i][y]='+';
}
for(int i=0;i<4;i++)
{
if(c[x][i]=='+') c[x][i]='-';
else c[x][i]='+';
}
if(c[x][y]=='+') c[x][y]='-';
else c[x][y]='+';
}
bool check(char c[][6])
{ for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
if(c[i][j]=='+')
return false;
return true;
}
void dfs(int x,int y,int res){
if(x==4)
{
if(check(c)&&res<sum)
{ memcpy(ans,cur,sizeof(ans));
sum=res;
}
return;
}
int dx=x,dy=y+1;
if(dy==4){
dx++,dy=0;
}
turn(x,y);
cur[res+1]={x,y};
dfs(dx,dy,res+1);
turn(x,y);
dfs(dx,dy,res);
}
int main()
{ for(int i=0;i<4;i++) cin>>c[i];
sum=0x3f3f3f3f;
dfs(0,0,0);
cout<<sum<<endl;
for(int i=1;i<=sum;i++)
{
cout<<ans[i].first+1<<" "<<ans[i].second+1<<endl;
}
return 0;
}
个人理解:递归的过程中记录了中间态(通过全局变量c),是一种记忆化搜索,而y总的循环没有记录中间态,有很多重复计算的过程,有点类似递归写fib和循环写fib的区别吧。