【问题描述】
铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成 n*n 个比较小的单位,其中用 1
标明的是陆地,用 0 标明是海洋。船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
【输入格式】
第一行为 n,下面是一个 n*n 的 0、1 矩阵,表示海洋地图
最后一行为四个小于 n 的整数,分别表示哥伦比亚号和铁塔尼号的位置。
【输出格式】
哥伦比亚号到铁塔尼号的最短距离,答案精确到整数。
【输入样例】
3
001
101
100
1 1 3 3
【输出样例】
4
深搜模板
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,outx,outy,inx,s,iny,x1,y1,ans=99999999;
int tox[5]={0,1,0,-1,0};
int toy[5]={0,0,1,0,-1};
int a[1001][1001],b[1001][1001];
char c[1001][1001];
void dfs(int x,int y)
{
if(x>n||x<1||y>n||y<1)
return ;
if(x==outx&&y==outy)
{
if(s>=ans)
return ;
else
ans=s;
}
if(s>=b[x][y])
return ;
else
b[x][y]=s;
for(int i=1;i<=4;i++)
{
x1=x+tox[i];
y1=y+toy[i];
if(a[x1][y1]==0)
{
s+=1;
dfs(x1,y1);
s-=1;
}
}
}
int main()
{
//freopen("save.in","r",stdin);
//freopen("save.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
cin>>c[i][j];
a[i][j]=c[i][j]-'0';
}
scanf("%d%d",&inx,&iny);
scanf("%d%d",&outx,&outy);
memset(b,0x7f,sizeof(b));
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}*/
dfs(inx,iny);
printf("%d",ans);
return 0;
}
广搜模板
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
int n,outx,outy,inx,s,iny,x,y;
int tox[5]={0,1,0,-1,0};
int toy[5]={0,0,1,0,-1};
int a[1001][1001],b[1001][1001],d[1000001][4];
char c[1001][1001];
int main()
{
int t=0,w=1,i,j;
//freopen("save.in","r",stdin);
//freopen("save.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
cin>>c[i][j];
a[i][j]=c[i][j]-'0';
}
scanf("%d%d",&inx,&iny);
scanf("%d%d",&outx,&outy);
b[inx][iny]=1;
d[1][1]=inx;
d[1][2]=iny;
d[1][3]=0;
while(t<w)
{
t++;
for(i=1;i<=4;i++)
{
x=d[t][1]+tox[i];
y=d[t][2]+toy[i];
if(x<1||x>n||y<1||y>n)
continue;
if(!a[x][y]&&!b[x][y])
{
w++;
b[x][y]=1;
d[w][1]=x;
d[w][2]=y;
d[w][3]=d[t][3]+1;
}
if(x==outx&&y==outy)
{
cout<<d[w][3];
return 0;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}