平常的一个人移动,可以写dfs(x,y,stp),但是这个是两个独立的人,移动方向是独立的,而且每一分钟都要两个人一起移动,所以不能这样写,要把两个人的坐标写在外面。仔细体会。
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 15;
char m[maxn][maxn];
int ans = 0;
int fx = -1,fy = -1,cx = -1,cy = -1;
int df,dc;
int vis[maxn][maxn][4][maxn][maxn][4];
bool check(int x,int y)
{
if(x>=1 && x<=10 && y>=1 && y<=10 && m[x][y]!='*') return true;
return false;
}
void dfs(int stp)
{
if(fx==cx && fy==cy)
{
ans = stp;
return;
}
if(vis[fx][fy][df][cx][cy][dc])
{
ans = 0;
return;
}
vis[fx][fy][df][cx][cy][dc] = 1;
if(df==0)
{
int newfx = fx - 1;
int newfy = fy;
if(check(newfx,newfy))
{
fx = newfx;
fy = newfy;
}
else
{
df = 1;
}
}
else if(df==1)
{
int newfx = fx;
int newfy = fy + 1;
if(check(newfx,newfy))
{
fx = newfx;
fy = newfy;
}
else
{
df = 2;
}
}
else if(df==2)
{
int newfx = fx + 1;
int newfy = fy;
if(check(newfx,newfy))
{
fx = newfx;
fy = newfy;
}
else
{
df = 3;
}
}
else if(df==3)
{
int newfx = fx;
int newfy = fy - 1;
if(check(newfx,newfy))
{
fx = newfx;
fy = newfy;
}
else
{
df = 0;
}
}
if(dc==0)
{
int newcx = cx - 1;
int newcy = cy;
if(check(newcx,newcy))
{
cx = newcx;
cy = newcy;
}
else
{
dc = 1;
}
}
else if(dc==1)
{
int newcx = cx;
int newcy = cy + 1;
if(check(newcx,newcy))
{
cx = newcx;
cy = newcy;
}
else
{
dc = 2;
}
}
else if(dc==2)
{
int newcx = cx + 1;
int newcy = cy;
if(check(newcx,newcy))
{
cx = newcx;
cy = newcy;
}
else
{
dc = 3;
}
}
else if(dc==3)
{
int newcx = cx;
int newcy = cy - 1;
if(check(newcx,newcy))
{
cx = newcx;
cy = newcy;
}
else
{
dc = 0;
}
}
dfs(stp+1);
}
int main()
{
memset(vis,0,sizeof(vis));
df = dc = 0;
for(int i=1;i<=10;i++) {
for (int j = 1; j <= 10; j++) {
char ch;
cin>>ch;
if (ch != '\n') {
m[i][j] = ch;
}
if (ch == 'F') {
fx = i;
fy = j;
}
if (ch == 'C') {
cx = i;
cy = j;
}
}
}
dfs(0);
printf("%d\n",ans);
return 0;
}