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