1 条题解
-
0
C :
#include<stdio.h> #define INT_MAX 99999 int g[300][300]; int a,b,n,k; int main() { int i,j; scanf("%d%d%d",&n,&a,&b); for (i=1;i<=n;++i) for (j=1;j<=n;++j) g[i][j]=INT_MAX; for (i=1;i<=n;++i) { g[i][i]=0; scanf("%d",&k); if (i+k<=n) g[i][i+k]=1; if (i-k>0) g[i][i-k]=1; } for (k=1;k<=n;++k) for (i=1;i<=n;++i) if (i!=k) for (j=1;j<=n;++j) if((i!=j)&&(j!=k)) if (g[i][j]>g[i][k]+g[k][j]) g[i][j]=g[i][k]+g[k][j]; if (g[a][b]==INT_MAX) printf("-1\n"); else printf("%d\n",g[a][b]); return 0; }
C++ :
#include <iostream> #include <limits.h> #include <cstring> using namespace std; #define F(i,j,k) for (int i=j;i<=k;i++) #define M 250 int A,B,n; int s[M],d[M]; bool b[M]; int t[M],head=0,tail=1; int main() { cin>>n>>A>>B; F(i,1,n) { cin>>s[i]; } memset(b,0,sizeof(b)); F(i,0,n) { d[i]=INT_MAX; } t[1]=A; b[A]=1; d[A]=0; do { head=(head+1)%M; int u=t[head]; b[u]=0; int v1=u+s[u],v2=u-s[u]; if (v1<=n && d[v1]>d[u]+1) { d[v1]=d[u]+1; if (!b[v1]) { tail=(tail+1)%M; t[tail]=v1; b[v1]=1; } } if (v2>0 && d[v2]>d[u]+1) { d[v2]=d[u]+1; if (!b[v2]) { tail=(tail+1)%M; t[tail]=v2; b[v2]=1; } } }while(head!=tail); if (d[B]==INT_MAX) cout<<-1; else cout<<d[B]; return 0; }
Pascal :
program p2979; var q:array[0..1000]of record d,x:longint; end; head,tail,n,a,b,i,j:longint; w:array[0..500]of longint; g:array[0..500]of boolean; flag:boolean; begin readln(n,a,b); for i:=1 to n do read(w[i]); readln; if a=b then begin writeln(0);halt;end; head:=0;tail:=1; g[a]:=true; q[1].d:=0;q[1].x:=a; repeat inc(head); i:=q[head].x; flag:=false; if i+w[i]<=n then if (not g[i+w[i]]) then begin inc(tail); q[tail].d:=q[head].d+1; q[tail].x:=i+w[i]; g[i+w[i]]:=true; if i+w[i]=b then begin writeln(q[tail].d);halt;end; end; if i-w[i]>=0 then if not(g[i-w[i]])then begin inc(tail); q[tail].d:=q[head].d+1; q[tail].x:=i-w[i]; g[i-w[i]]:=true; if i-w[i]=b then begin writeln(q[tail].d);halt;end; end; until head>tail; writeln(-1); end.
- 1
信息
- ID
- 737
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者