奇怪的电梯(dfs)

题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N),N上有一个数字Ki(0≤Ki≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3,3,1,2,5代表了Ki​(K1​=3,K2​=3,…),从1楼开始。在1楼,按“上”可以到4楼,按“下”是不起作用的,因为没有−2楼。那么,从A楼到B楼至少要按几次按钮呢?
思路:dfs,将层数看成顶点,用邻接矩阵存顶点之间的关系,不过这个题用dfs做的话要剪枝。

# include<bits/stdc++.h>
using namespace std;
int r1,r2,n,a[201][201],min1;
int b[201];
void Q (int x, int k)
{
    if (k>=min1) return ;//当存的数小于要找的数时,可以直接return;
    int i;
    if (x==r2) min1=min(min1,k);
    if (b[x]) return ;
       b[x]=1;
    for (i=1;i<=n;i++)
    {
        if (a[x][i]&&x!=i)
        {
            Q (i,k+1);
        }
    }
     b[x]=0;
}
int main ( )
{
    int i,b1;
    while (cin>>n>>r1>>r2)
    {
        memset (b,0,sizeof (b));
        min1=10001;
        for (i=1;i<=n;i++)
        {
            cin>>b1;
            if (i+b1<=n) a[i][i+b1]=1;
            if (i-b1>0)  a[i][i-b1]=1;
        }
        Q (r1,0);
        if (min1==10001) cout<<"-1"<<endl;
        else cout<<min1<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43700997/article/details/89159987