1 条题解

  • 0
    @ 2025-2-14 21:15:55

    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
    上传者