SSL_2278 Oliver的救援

题意:

      从矩阵上的一个地方走到另一个地方,0表示路通,1表示走不通,求最少步数。

思路:

      用广搜,深搜也可以。

代码:

#include<cstdio>
int n,a[1100][1100],state[1111000][3],x,y,px,py,best;
short dx[5]={0,1,0,-1,0},dy[5]={0,0,1,0,-1};
char c;
bool check(int x,int y)
{
	if (1>x||x>n||1>y||y>n||a[x][y]==1) return false;
	return true;
}
void bfs()
{
	int tail,head;
	state[1][1]=x;state[1][2]=y;state[1][3]=0;tail=1;head=0;
	do
	{
		head++;
		for (int i=1;i<=4;i++)
		{
	        if(check(state[head][1]+dx[i],state[head][2]+dy[i]))
	        {
	        	    tail++;
		 	    state[tail][1]=state[head][1]+dx[i];
		 	    state[tail][2]=state[head][2]+dy[i];
		 	    state[tail][3]=state[head][3]+1;//state[][1]记录横坐标,state[][2]记录纵坐标,state[][3]记录步数
		 	    a[state[tail][1]][state[tail][2]]=1;	  
				if (state[tail][1]==px&&state[tail][2]==py)
				{
					best=tail;
					return;
				}      	
	        }
		}
	}
	while (head<tail);
}
int main()
{
	scanf("%d",&n);c=getchar();
	for (int i=1;i<=n;i++)
	{
	 for (int j=1;j<=n;j++)
	 {
	    c=getchar();
	 	a[i][j]=c-48;
	 }	  
	 c=getchar();
	}

	scanf("%d%d%d%d",&x,&y,&px,&py);//分别代表起点坐标和终点坐标
	bfs();
	printf("%d",state[best][3]);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值