杭电 1240 Asteroids! 解题报告

    题意基本是说空间中有小行星阻挡,你要从起点移动到终点,每次移动一个单位,求最短路径。

    因为刚刚接触图论,乍一看以为要深搜或者广搜啥的。仔细想想之后,发现还是蛮容易的。

    因为题目上的坐标包括0,不好做边界处理,索性都+1。

    小行星处记为-1,在起点处记为1,步数t记为1。然后遍历吧,发现和步数一致的点时判断上下左右前后六个点是否是初始化时的0状态,是的话赋值t+1,即代表t+1步时可以到达此点。遍历前判断终点处的值是否大于0了,大于的话退出循环。然后如果遍历一遍没有找到与步数t一致的点,退出循环,测试也过了,但是可以不写。

    因为起点为方便处理记为1,所以最终的答案减去1。

    下面是AC的代码:

#include <iostream>

using namespace std;



int main()

{

    char str[12];

    int i,j,k,n,a,b,c,d,e,f,t,s[12][12][12];

    while(cin>>str>>n)

    {

        memset(s,0,sizeof(s));

        for(k=1;k<=n;k++)

            for(i=1;i<=n;i++)

                for(cin>>str,j=1;j<=n;j++)

                    s[i][j][k]=(str[j-1]=='X'?-1:0);

        cin>>a>>b>>c>>d>>e>>f>>str;

        t=s[a+1][b+1][c+1]=1;

        d++;

        e++;

        f++;

        while(t<=n*n*n)

        {

            if(s[d][e][f]>0)

                break;

            for(i=1;i<=n;i++)

                for(j=1;j<=n;j++)

                    for(k=1;k<=n;k++)

                        if(s[i][j][k]==t)

                        {

                            if(s[i-1][j][k]==0)

                                s[i-1][j][k]=t+1;

                            if(s[i+1][j][k]==0)

                                s[i+1][j][k]=t+1;

                            if(s[i][j-1][k]==0)

                                s[i][j-1][k]=t+1;

                            if(s[i][j+1][k]==0)

                                s[i][j+1][k]=t+1;

                            if(s[i][j][k-1]==0)

                                s[i][j][k-1]=t+1;

                            if(s[i][j][k+1]==0)

                                s[i][j][k+1]=t+1;

                        }

            t++;

        }

        if(s[d][e][f])

            cout<<n<<' '<<s[d][e][f]-1<<endl;

        else

            cout<<"NO ROUTE"<<endl;

    }

}

 

你可能感兴趣的:(id)