永发信息网

杭电acm1548 帮忙看下

答案:4  悬赏:40  手机版
解决时间 2021-03-15 00:21
  • 提问者网友:棒棒糖
  • 2021-03-14 06:34
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,能通过编译的
能不能帮我看看,关键错哪了
最佳答案
  • 五星知识达人网友:千夜
  • 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楼网友:冷風如刀
  • 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; }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯