题目描述
这里有一个长度为n非负整数数组 arr,你最开始位于该数组的起始下标 m 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。
请你判断自己是否能够跳到对应元素值为 0 的下标处。
注意,不管是什么情况下,你都无法跳到数组之外。
输入
测试样例由多组测试数据组成。每组测试数据第一行输入两个正整数 n (1 <= n <= 50000 ), m ( 0 <= m < n )
第二行输入n个正整数ni ( 0 <= ni <= 500 )
输出
若你可以跳到对应元素值为0的下标出,输出YES
否则输出NO
样例输入 Copy
7 5
4 2 3 0 3 1 2
5 2
3 0 2 1 2
样例输出 Copy
YES
NO
思路
BFS开始bfs搜索到结果了直接break并且函数没有清空导致wa了很多次,最后删掉了break,让bfs函数将队列内容全部弹出。
AC代码
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
queue<int> q;
int map[50005];
int vis[50005];
int n,m;
int flag=0;
int check(int x){
if(x>=0&&x<n){
return true;
}
return false;
}
void bfs(){
while(q.size()){
int temp=q.front();
if(map[temp]==0){
flag=1;
}
q.pop();
if(check(temp+map[temp])&&vis[temp+map[temp]]==0){
q.push(temp+map[temp]);
vis[temp+map[temp]]=1;
}
if(check(temp-map[temp])&&vis[temp-map[temp]]==0){
q.push(temp-map[temp]);
vis[temp-map[temp]]=1;
}
}
}
int main(){
while(scanf("%d %d",&n,&m)!=EOF){
flag=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++){
scanf("%d",&map[i]);
}
q.push(m);
vis[m]=1;
bfs();
if(flag==1){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}