waibiwaibi11 2023-04-22 19:06 采纳率: 100%
浏览 25
已结题

用循环队列进行广度搜索

用循环队列求解一个问题
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压入循环队列
程序提前结束,想知道是哪里不对

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-04-22 19:37
    关注

    基于Monster 组和GPT的调写:

    队列的大小被定义为#define MAXN 1000,也就是说,队列的最大长度为1000。但是在你的代码中,并没有判断队列的长度是否超过了最大值,也就是说,你的队列长度是不受限制的,因此,在输入1 1 0 1050后,当队列中元素的数量超过了1000时,程序会崩溃
    push函数中加一个:

    if((tail+1)%MAXN == head){
        // 队列已满,无法添加新元素
        return;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 创建了问题 4月22日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭