北大2225题

来源:互联网 发布:ubuntu add to dash 编辑:程序博客网 时间:2024/05/01 08:09

 题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2225

是个广度优先搜索题目,框架与图的广度优先搜索相同,但是实现上有所区别,主要是因为存储结构上的差异,图的邻接矩阵中相邻的点并不一定是逻辑相邻,而这个地图的存储结构中相邻的点就是逻辑上相邻的点。所以图的广度优先搜索用到辅助数组dist来表示距离同时也表示是否被访,而这个图直接可以设置被访到位置值就可以标示是否被访和距离。

#include <iostream>
#include <string>
#include <queue>
using namespace std;

#define MAX 10

struct Pos
{
 int s;
 int r;
 int c;
};

int main()
{
 freopen("in.txt","r",stdin);

 char tag[MAX],map[MAX][MAX][MAX];
 int i,j,k,n,move[6][3];
 Pos b,d,c;
 queue<Pos> q;
 move[0][0] = 0,move[0][1] = 1,move[0][2] = 0;
 move[1][0] = 0,move[1][1] = -1,move[1][2] = 0;
 move[2][0] = 0,move[2][1] = 0,move[2][2] = 1;
 move[3][0] = 0,move[3][1] = 0,move[3][2] = -1;
 move[4][0] = 1,move[4][1] = 0,move[4][2] = 0;
 move[5][0] = -1,move[5][1] = 0,move[5][2] = 0;
 while(cin >> tag >> n)
 {
  for(i = 0;i < n;++i)
  {
   for(j = 0;j < n;++j)
   {
    for(k = 0;k < n;++k)
     cin >> map[i][j][k];
   }
  }
  
  cin >> b.c >> b.r >> b.s;
  cin >> d.c >> d.r >> d.s;
  
  q.push(b);
  map[b.s][b.r][b.c] = 0;
  while(!q.empty())
  {
   b = q.front();
   q.pop();
   
   for(i = 0;i < 6;++i)
   {
    c.s = b.s + move[i][0];
    c.r = b.r + move[i][1];
    c.c = b.c + move[i][2];
    
    if(c.s >= 0 && c.s < n && c.r >= 0 && c.r < n &&
     c.c >= 0 && c.c < n)
    {
     if(map[c.s][c.r][c.c] == 'O')
     {
      map[c.s][c.r][c.c] = map[b.s][b.r][b.c] +1;
      q.push(c);
     }
     if(c.s == d.s && c.r == d.r && c.c == d.c)
      break;
    }
   }
  }
  
  cin >> tag;
  if(map[d.s][d.r][d.c] != 'O')
   cout << n << ' ' << (int)map[d.s][d.r][d.c] << endl;
  else
   cout << "NO ROUTE" << endl;
 }
 return 0;
}

原创粉丝点击