这题是广搜的一道难度中等的题,主要注意题目的意思,然后就是典型的广搜了,直接贴代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
#define MAX 22
#define maxn 100000
struct Por
{
int x;
int y;
int deep;
}node[maxn];
int p[MAX][MAX];
bool mark[MAX][MAX];
int n,m,ans;
int start_x,start_y,end_x,end_y;
bool BFS();
int main()
{
while(scanf("%d%d",&m,&n),m,n)
{
int i,j;
int a;
memset(mark,true,sizeof(mark));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&a);
p[i][j]=a;
if(a==1)
mark[i][j]=false;
else if(a==2)
{
start_x=i;
start_y=j;
//cout << start_x << " " << start_y << endl;
}
else if(a==3)
{
end_x=i;
end_y=j;
}
}
if(BFS()&& ans<=10)
printf("%d\n=========================",ans);
else
printf("-1\n");
}
return 0;
}
bool BFS()
{
int i,now=0,head=0;
node[now].x=start_x;
node[now].y=start_y;
node[now++].deep=0;
while(head<now)
{
Por q=node[head++];
int x=q.x;
int y=q.y;
int deep=q.deep;
if(mark[x-1][y])
{
for(i=x-1;i>=0;i--)
{
if(i==end_x && y==end_y)
{
ans=deep+1;
return true;
}
if(!mark[i][y])
break;
}
if(i>=0)
{
mark[i][y]=true;
node[now].x=i+1;
node[now].y=y;
node[now++].deep=deep+1;
}
}
if(mark[x+1][y])
{
for(i=x+1;i<=n+1;i++)
{
if(i==end_x && y==end_y)
{
ans=deep+1;
return true;
}
if(!mark[i][y])
break;
}
if(i<=n+1)
{
mark[i][y]=true;
node[now].x=i-1;
node[now].y=y;
node[now++].deep=deep+1;
}
}
if(mark[x][y-1])
{
for(i=y-1;i>=0;i--)
{
if(x==end_x && i==end_y)
{
ans=deep+1;
return true;
}
if(!mark[x][i])
break;
}
if(i>=0)
{
mark[x][i]=true;
node[now].x=x;
node[now].y=i+1;
node[now++].deep=deep+1;
}
}
if(mark[x][y+1])
{
for(i=y+1;i<=m+1;i++)
{
if(x==end_x && i==end_y)
{
ans=deep+1;
return true;
}
if(!mark[x][i])
break;
}
if(i<=m+1)
{
mark[x][i]=true;
node[now].x=x;
node[now].y=i-1;
node[now++].deep=deep+1;
}
}
}
return false;
}