题目:
Drizzle 被困到一条充满数字的方块路中,假设这条路由一个非负的整数数组m
组成,Drizzle 最开始的位置在下标 start
处,当他位于下标i
位置时可以向前或者向后跳跃m[i]
步数,已知元素值为0
处的位置是出口,且只能通过出口出去,不可能数组越界,请你通过编程计算出Drizzle能否逃出这里。
要求:
输入:第一行输入数组m
的长度n
第二行输入数组元素,空格分割开 第三行输入起始下标start
示例:
输入:
7
4 2 3 0 3 1 2
5
输出:
True
思路:通过队列将每个可以走到的点存入,并且保证每个点只存入一次(用bool类型实现),在搜索的过程中如果遇到0,直接输出True,否则输出False
代码:
#include <bits/stdc++.h>
using namespace std;
int m[50005] = {}, n, start;
bool vis[50005] = { false };
queue<int>q;
int main()
{
cin >> n;
for (int i = 0;i < n;i++)
cin >> m[i];
cin >> start;
q.push(start);
while (!q.empty())
{
int fir = q.front();
if (m[fir] == 0)
{
cout << "True";
return 0;
}
q.pop(); //删去首元素
vis[fir] = true;
int na = fir + m[fir], nb = fir - m[fir]; //下一次的位置
if (na < n && vis[na] == false)
q.push(na);
if (nb >= 0 && vis[nb] == false)
q.push(nb);
}
cout << "False";
return 0;
}