http://acm.hdu.edu.cn/showproblem.php?pid=1548
测试数据都对啊,怎么就WA
#include<stdio.h>
#include<stdlib.h>
int s[200];
int m[200][2];
int a,b,n;
int main()
{
int i,t;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d %d",&a,&b);
memset(m,-1,sizeof(m));
memset(s,0,sizeof(s));
for(i=1;i<=n;i++)
scanf("%d",&s[i]);
if(a==b)
{
printf("0\n");
continue;
}
for(i=1;i<=n;i++)
{
if(i-s[i]>0)m[i][0]=i-s[i];
if(i+s[i]<=n)m[i][1]=i+s[i];
}
Search();
}
return 0;
}
Search()
{
int i,j,z=0,t=0,k1,k2,q;
int max=32767;
typedef struct
{
int data[10000];
int jl[10000];
int front,rear;
}sequeue;
sequeue sq;
sq.front=-1;
sq.rear=-1;
sq.rear=sq.rear+1;
sq.data[sq.rear]=a;
sq.jl[sq.rear]=0;
while(sq.front!=sq.rear)
{
k1=k2=0;
sq.front=sq.front+1;
q=sq.data[sq.front];
if(q==b)
{
i=sq.jl[sq.rear];
while(i!=0)
{
for(j=0;j<sq.rear;j++)
if(sq.data[j]==i)
{i=sq.jl[j];t++;break;}
}
z=1;
if(t<max)
max=t;
}
if(m[q][0]==-1&&m[q][1]==-1)
break;
else
{
if(m[q][0]!=-1)
{
for(i=0;i<=sq.rear;i++)
if(m[q][0]==sq.data[i])
k1=1;
if(k1==0)
{
sq.rear=sq.rear+1;
sq.data[sq.rear]=m[q][0];
sq.jl[sq.rear]=q;
}
}
if(m[q][1]!=-1)
{
for(i=0;i<=sq.rear;i++)
if(m[q][1]==sq.data[i])
k2=1;
if(k2==0)
{
sq.rear=sq.rear+1;
sq.data[sq.rear]=m[q][1];
sq.jl[sq.rear]=q;
}
}
}
}
if(z==0)
printf("-1\n");
else
printf("%d\n",max);
return 0;
}
还是WA,能通过编译的
能不能帮我看看,关键错哪了
杭电acm1548 帮忙看下
答案:4 悬赏:40 手机版
解决时间 2021-03-15 00:21
- 提问者网友:棒棒糖
- 2021-03-14 06:34
最佳答案
- 五星知识达人网友:千夜
- 2021-03-14 07:33
你的程序有两处错误。
(1)题目中明确声明( 1 <= N,A,B <= 200),而你的数组s和m的大小是200,也就是0-199这两百个,而没有声明s[200]和m[200][0]、m[200][1]。
(2)你用于寻找输出的那个循环有问题。不应当寻找队尾的那层到底需要多少步,而需要寻找到b层需要多少步。按你的程序,第b层应该在队头而不是在队尾。所以i应该等于sq.jl[sq.front];而不应该等于i=sq.jl[sq.rear];而且循环j应该从0到sq.front-1,因为你的答案应该从已搜索过的点中找,而不应该去找
还没有搜索过的点。
(3)你发在百度知道上的程序确实无法编译。search函数在主函数前没有声明,所以不能再主函数中调用。你的search函数有返回值return 0;却没有声明函数是什么类型的!这一定不符合C++标准。
程序修改后如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int s[201];
int m[201][2];
int a,b,n;
void Search();
int main()
{
int i,t;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d %d",&a,&b);
memset(m,-1,sizeof(m));
memset(s,0,sizeof(s));
for(i=1;i<=n;i++)
scanf("%d",&s[i]);
if(a==b)
{
printf("0\n");
continue;
}
for(i=1;i<=n;i++)
{
if(i-s[i]>0)m[i][0]=i-s[i];
if(i+s[i]<=n)m[i][1]=i+s[i];
}
Search();
}
return 0;
}
void Search()
{
int i,j,z=0,t=0,k1,k2,q;
int max=32767;
typedef struct
{
int data[10000];
int jl[10000];
int front,rear;
}sequeue;
sequeue sq;
sq.front=-1;
sq.rear=-1;
sq.rear=sq.rear+1;
sq.data[sq.rear]=a;
sq.jl[sq.rear]=0;
while(sq.front!=sq.rear)
{
k1=k2=0;
sq.front=sq.front+1;
q=sq.data[sq.front];
if(q==b)
{
i=sq.jl[sq.front];
while(i!=0)
{
for(j=0;j<sq.front;j++)
if(sq.data[j]==i)
{i=sq.jl[j];t++;break;}
}
z=1;
if(t<max)
max=t;
}
if(m[q][0]==-1&&m[q][1]==-1)
break;
else
{
if(m[q][0]!=-1)
{
for(i=0;i<=sq.rear;i++)
if(m[q][0]==sq.data[i])
k1=1;
if(k1==0)
{
sq.rear=sq.rear+1;
sq.data[sq.rear]=m[q][0];
sq.jl[sq.rear]=q;
}
}
if(m[q][1]!=-1)
{
for(i=0;i<=sq.rear;i++)
if(m[q][1]==sq.data[i])
k2=1;
if(k2==0)
{
sq.rear=sq.rear+1;
sq.data[sq.rear]=m[q][1];
sq.jl[sq.rear]=q;
}
}
}
}
if(z==0)
printf("-1\n");
else
printf("%d\n",max);
}
(1)题目中明确声明( 1 <= N,A,B <= 200),而你的数组s和m的大小是200,也就是0-199这两百个,而没有声明s[200]和m[200][0]、m[200][1]。
(2)你用于寻找输出的那个循环有问题。不应当寻找队尾的那层到底需要多少步,而需要寻找到b层需要多少步。按你的程序,第b层应该在队头而不是在队尾。所以i应该等于sq.jl[sq.front];而不应该等于i=sq.jl[sq.rear];而且循环j应该从0到sq.front-1,因为你的答案应该从已搜索过的点中找,而不应该去找
还没有搜索过的点。
(3)你发在百度知道上的程序确实无法编译。search函数在主函数前没有声明,所以不能再主函数中调用。你的search函数有返回值return 0;却没有声明函数是什么类型的!这一定不符合C++标准。
程序修改后如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int s[201];
int m[201][2];
int a,b,n;
void Search();
int main()
{
int i,t;
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d %d",&a,&b);
memset(m,-1,sizeof(m));
memset(s,0,sizeof(s));
for(i=1;i<=n;i++)
scanf("%d",&s[i]);
if(a==b)
{
printf("0\n");
continue;
}
for(i=1;i<=n;i++)
{
if(i-s[i]>0)m[i][0]=i-s[i];
if(i+s[i]<=n)m[i][1]=i+s[i];
}
Search();
}
return 0;
}
void Search()
{
int i,j,z=0,t=0,k1,k2,q;
int max=32767;
typedef struct
{
int data[10000];
int jl[10000];
int front,rear;
}sequeue;
sequeue sq;
sq.front=-1;
sq.rear=-1;
sq.rear=sq.rear+1;
sq.data[sq.rear]=a;
sq.jl[sq.rear]=0;
while(sq.front!=sq.rear)
{
k1=k2=0;
sq.front=sq.front+1;
q=sq.data[sq.front];
if(q==b)
{
i=sq.jl[sq.front];
while(i!=0)
{
for(j=0;j<sq.front;j++)
if(sq.data[j]==i)
{i=sq.jl[j];t++;break;}
}
z=1;
if(t<max)
max=t;
}
if(m[q][0]==-1&&m[q][1]==-1)
break;
else
{
if(m[q][0]!=-1)
{
for(i=0;i<=sq.rear;i++)
if(m[q][0]==sq.data[i])
k1=1;
if(k1==0)
{
sq.rear=sq.rear+1;
sq.data[sq.rear]=m[q][0];
sq.jl[sq.rear]=q;
}
}
if(m[q][1]!=-1)
{
for(i=0;i<=sq.rear;i++)
if(m[q][1]==sq.data[i])
k2=1;
if(k2==0)
{
sq.rear=sq.rear+1;
sq.data[sq.rear]=m[q][1];
sq.jl[sq.rear]=q;
}
}
}
}
if(z==0)
printf("-1\n");
else
printf("%d\n",max);
}
全部回答
- 1楼网友:冷風如刀
- 2021-03-14 09:22
程序无法编译
search没有声明
memset应包含string.h
- 2楼网友:青尢
- 2021-03-14 09:01
程序无法编译
search没有声明
memset应包含string.h
再看看别人怎么说的。
- 3楼网友:老鼠爱大米
- 2021-03-14 08:00
// 广度优先搜索的方式
// 下面是AC代码
#include <stdio.h>
#include <string.h>
int fl[201];
int n, start, end;
typedef struct Po
{
int position, steps;
}Po;
Po paths[400];
int flag[201];
int Play()
{
int i, t;
Po temp;
t = 0;
paths[0].position = start; paths[0].steps = 0;
flag[paths[0].position] = 1;
if (paths[0].position == end) return paths[0].steps;
for (i = 0; i <= t; i++)
{
if (paths[i].position + fl[paths[i].position] <= n)
{
temp.position = paths[i].position + fl[paths[i].position];
temp.steps = paths[i].steps + 1;
if (flag[temp.position] != 1)
{
flag[temp.position] = 1;
paths[++t] = temp;
if (paths[t].position == end) return paths[t].steps;
}
}
if (paths[i].position - fl[paths[i].position] > 0)
{
temp.position = paths[i].position - fl[paths[i].position];
temp.steps = paths[i].steps + 1;
if (flag[temp.position] != 1)
{
flag[temp.position] = 1;
paths[++t] = temp;
if (paths[t].position == end) return paths[t].steps;
}
}
}
return -1;
}
int main()
{
int i;
while (scanf("%d",&n)==1 && n)
{
memset(flag,0,sizeof(flag));
scanf("%d %d",&start,&end);
for (i = 1; i <= n; i++) scanf("%d",&fl[i]);
printf("%d\n",Play());
}
return 0;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯