用循环队列求解一个问题
F 神正在爬楼梯,他从第 0 级台阶出发,想要爬到第 P 级台阶。他一次可以爬的台阶数目
是固定的,为 a1, a2, ,, aN 这 N 个数中的一个。
由于年久失修,一共有 M 级台阶损坏了,分别为 b1, b2, , , bM 级台阶,如果走上这些台
阶,F 神就会坠落。
请问是否存在方案,使得 F 神能够爬到第 P 级台阶?
Input
输入共五行。
输入的第一行为一个正整数 N。
输入的第二行为 N 个正整数,第 i 个为 ai。
输入的第三行为一个正整数 M。
输入的第四行为 M 个正整数,第 i 个为 bi。
输入的第五行为 P。
Output
输出一行一个字符串,若可以爬到,输出 Yes,否则输出 No。
#include<stdio.h>
#define MAXN 1000
int N;
int n[15];
int M;
int m[MAXN]={0};
int p;
int queue[MAXN];
int head=0,tail=0;
void push(int x){
if((tail+1)%MAXN==head){
return ;
}else{
tail=(tail+1)%MAXN;
queue[tail]=x;
}
}
int pop(void){
if(head==tail){
return 0;
} else{
head=(head+1)%MAXN;
return queue[head];
}
}
int main(){
scanf("%d",&N);
int i;
for(i=1;i<=N;i++){
scanf("%d",&n[i]);
}
scanf("%d",&M);
int t;
for(i=1;i<=M;i++){
scanf("%d",&t);
m[t]=1;
}
scanf("%d",&p);
queue[0]=0;
tail=1;
while(head!=tail && queue[head]<p){
int t=pop();
printf("t=%d head=%d tail =%d\n",t,head,tail);
for(i=1;i<=N;i++){
if(m[t+n[i]]==0){
push(t+n[i]);
m[t+n[i]]=1;
}
}
}
if(queue[head]==p){
printf("Yes");
}else{
printf("No");
}
return 0;
}
我在输入1 1 0 1050后
输出结果:
t=993 head=994 tail =995
t=994 head=995 tail =996
t=995 head=996 tail =997
t=996 head=997 tail =998
t=997 head=998 tail =999
t=998 head=999 tail =0
t=999 head=0 tail =0
No
跑到最后一行tail=0时并未将999压入循环队列
程序提前结束,想知道是哪里不对