状态可表示成(6)元祖的形式:
[(x_{cow},y_{cow},direction_{cow},x_{farmer},y_{farmer},direction_{farmer})
]
由于每个状态每轮只会扩展出一个状态(即只有一种决策),就不需要借助队列来进行(BFS)了。
const int N = 15;
struct Node
{
int x,y,dir;
}c,f;
bool vis[N][N][4][N][N][4];
char g[N][N];
int n=10;
bool check(int x,int y)
{
return x >= 0 && x < n && y >= 0 && y < n;
}
void move(Node &t)
{
int a=t.x+dx[t.dir], b=t.y+dy[t.dir];
if(check(a,b) && g[a][b] != '*')
{
t.x=a;
t.y=b;
}
else
t.dir=(t.dir+1)%4;
}
int bfs()
{
int step=0;
vis[c.x][c.y][c.dir][f.x][f.y][f.dir]=true;
while(true)
{
if(c.x == f.x && c.y == f.y) return step;
else step++;
move(c);
move(f);
if(vis[c.x][c.y][c.dir][f.x][f.y][f.dir])
return 0;
else
vis[c.x][c.y][c.dir][f.x][f.y][f.dir]=true;
}
}
int main()
{
for(int i=0;i<n;i++) scanf("%s",g[i]);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(g[i][j] == 'C')
c={i,j,0};
else if(g[i][j] == 'F')
f={i,j,0};
cout<<bfs()<<endl;
//system("pause");
return 0;
}