解救
我想不会有什么帮助的索引
队列我有写过一篇题解来说明,见:【C++广度搜索入门】面积
这是我的第二篇广搜题解,可能仍有众多不足,请大家多指教,欢迎与我讨论
题目
问题 B: 营救
时间限制: 1 Sec 内存限制: 128 MB
题目描述
铁塔尼号遇险了!他发出了求救信号。距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里。
通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n*n个比较小的单位,其中用1标明的是陆地,用0标明是海洋。船只能从一个格子,移到相邻的四个格子。
为了尽快赶到出事地点,哥伦比亚号最少需要走多远的距离。
输入
第一行为n,下面是一个n*n的0、1矩阵,表示海洋地图
最后一行为四个小于n的整数,分别表示哥伦比亚号和铁塔尼号的位置。
输出
哥伦比亚号到铁塔尼号的最短距离.
样例输入
3 001 101 100 1 1 3 3
样例输出
4
提示
N<=1000
题解
输入那里我卡了很久,请注意输入的处理
#include<bits/stdc++.h>
using namespace std;
struct hhh
{
int h,l,s;//行,列,步数
}qwq[1000005];
int jz[1005][1005]={0},vis[1005][1005]={0};
int main()
{
int bh[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int head,tail,ax,ay,bx,by,flag=0,n,nx,ny;
char ch;
scanf("%d",&n);
//由于输入是001,,100这样的,所以为了读1,0,0,而不是100,先转化成字符型再转化成整型,达到一个个读入
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(cin>>ch) jz[i][j]=ch-'0';
}
}
scanf("%d %d %d %d",&ax,&ay,&bx,&by);
//队列初始化
head=1;tail=1;
qwq[tail].h=ax;
qwq[tail].l=ay;
qwq[tail].s=0;
tail++;
vis[ax][ay]=1;
while(head<tail)
{
for(int i=0;i<4;i++)
{
nx=qwq[head].h+bh[i][0];
ny=qwq[head].l+bh[i][1];
if(nx<1||nx>n||ny<1||ny>n)
continue;
if(jz[nx][ny]==0&&vis[nx][ny]==0)
{
vis[nx][ny]=1;
qwq[tail].h=nx;//入队
qwq[tail].l=ny;
qwq[tail].s=qwq[head].s+1;
tail++;
}
if(nx==bx&&ny==by)//到达目的地
{
flag=1;break;
}
}
if(flag==1) break;
head++;//不管有没有新成员入队都要对已有的成员出队操作
}
//tail指向队尾(最后一个元素的下一个位置,所以-1)
cout<<qwq[tail-1].s<<endl;
return 0;
}
相关阅读
常见十大(内部)排序算法 - Sorting Algorithms C++
基本概念 内部和外部排序 内部排序在这里指的是只用到了电脑内存而不使用外存的排序方式。相对的,外部排序就是同时动用了电脑内
程序很简单,重要的是二维指针的动态分配内存 type **Matrix ;//row为行,col为列 Matrix=(type **) malloc(row*sizeof(type *)
数据结构与算法分析-C++描述 第7章 插入排序(insertion
插入排序(insertionSort): 插入排序是最简单的排序算法之一。插入排序由趟排序组成,对于到,插入排序保证从位置0到上的元素已
C++中std::ostringstream输出用法 一、简单介绍 ostringstream是C++的一个字符集操作模板类,定义在sstream.h头文件中。ostrin
c++圈圈叉叉游戏 #include <iostream> #include<string> #define SIZE 4//格子大小为4*4 using std::cout; using std::end