N*M的矩阵,有坦克A和B,终点C和D坦克A需要走到C,坦克B需要走到D。

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;
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值