杭电 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;
    }
}

 

posted @ 2013-02-16 22:23  SF-_-  阅读(365)  评论(0编辑  收藏  举报