N*M的矩阵,有坦克A和B,终点C和D 坦克A需要走到C,坦克B需要走到D。 每经过一秒,坦克可以选择周围的8个方向任意移动一步,也可以选择原地不动。 但是两个坦克不能相邻(周围8个方向),也不能去有墙的地方 问,最少需要多少秒,才能使两个坦克都达到目的地
#include<iostream>
using namespace std;
bool visit[9][9][9][9]={0};
int s1i,s1j,s2i,s2j,e1i,e1j,e2i,e2j;
int step;
int map[9][9]={0};
struct tag
{
int x1;
int y1;
int x2;
int y2;
int step;
}queue[100000];
int dir[9][2]={{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,0}};
int head=1,tail=1;
int bfs()
{ int x1,x2,y1,y2;
queue[tail].x1=s1i;
queue[tail].y1=s1j;
queue[tail].x2=s2i;
queue[tail].y2=s2j;
queue[tail++].step=0;
visit[s1i][s1j][s2i][s2j]=1;
while(head<tail)
{
tag cur=queue[head++];
if(cur.x1==e1i&&cur.y1==e1j&&cur.x2==e2i&&cur.y2==e2j)
{
step=cur.step;
break;
}
for(int k1=0;k1<9;k1++)
{int t1;
x1=cur.x1+dir[k1][0];
y1=cur.y1+dir[k1][1];
if(map[x1][y1]==-1) continue;
t1=map[x1][y1];
map[x1][y1]=8;
for(int k2=0;k2<9;k2++)
{int t2;
x2=cur.x2+dir[k2][0];
y2=cur.y2+dir[k2][1];
if(map[x2][y2]==-1) continue;
if(visit[x1][y1][x2][y2]==1) continue;
if((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)>2)
{ t2=map[x2][y2];
map[x2][y2]=9;
visit[x1][y1][x2][y2]=1;
queue[tail].x1=x1;
queue[tail].y1=y1;
queue[tail].x2=x2;
queue[tail].y2=y2;
queue[tail++].step=cur.step+1;
printf(" Step:%d\n",queue[tail-1].step);
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(map[i][j]==-1) printf("%d",map[i][j]);
else printf(" %d",map[i][j]);
}
printf("\n");
}
map[x2][y2]=t2;
}
}
map[x1][y1]=t1;
}
}
return step;
}
int main()
{ for(int z=0;z<=9;z++)
{
map[0][z]=-1;
map[z][0]=-1;
map[9][z]=-1;
map[z][9]=-1;
}
int s;
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
if(map[i][j]==-1) printf("%d",map[i][j]);
else printf(" %d",map[i][j]);
}
printf("\n");
}
printf("\n");
printf("pls input x1,y1,x2,y2:");
scanf("%d%d%d%d",&s1i,&s1j,&s2i,&s2j);
printf("pls input e1i,e1j,e2i,e2j:");
scanf("%d%d%d%d",&e1i,&e1j,&e2i,&e2j);
map[e1i][e1j]=6;
map[e2i][e2j]=7;
s=bfs();
printf("the s=:%d\n",s);
return 0;
}