2011年華はプログラミング大会のテーマです


3.バス停の場所探し(50分)
l  
問題の説明
1つのN*N 2次元マトリクスは都市レイアウトを表し、要素値は'.','のみである.X',‘B',‘S',Xは現在の位置を表し,Bはバリケードを表し,Sはバス停を表す.’実行可能なパスを表します.現在、所与の経路長Yは、到達可能なバス停の個数を見つけ、経路にバリアを含めることはできない.
パスの長さの定義:
1、 
ノードとそれ自体の距離は0です.
2、 
ノードとその上、下、左、右の4つの隣接ノードの距離はすべて1です.
l  
要求実装関数
int FindStat(const char*Map,unsigned int iArrN,unsigned int iPathLen)【入力】Map:都市レイアウトiArrN:都市レイアウトマトリクスの行数iPathLen:所与の経路長【出力】なし【戻る】到着可能なバス停数注:入力行列は、一次元で保存された二次元配列であり、例えば、「A」、「B」、「C」、「D」、「E」、「F」、「G」、「H」、「I」と入力され、実際には以下の3*3の行列「A」、「B」、「C」、「D」、「E」、「F」、「G」、「H」、「I」を表す
l  

入力:「...S.....X.S.....S....」5,3リターン:2入力:“S…S……BS……..X”,5,5リターン:1
#include<stdio.h>
#include<stdlib.h>
#include<queue>

int FindStat (const char *Map, unsigned int iArrN, unsigned int iPathLen)
{
  int arrCount = iArrN*iArrN;
  int iVisited, xDirect, sum = 0;
  int locationX = -1;
  char* visited = (char *)malloc(arrCount * sizeof(char));
  int* path = (int *)malloc(arrCount * sizeof(int));

  for(int i = 0; i < arrCount; i++)
    {
      if(Map[i] == '.'||Map[i] == 'S') visited[i] = -1;
      else if(Map[i] == 'B')
    {
      visited[i] = 0;
      path[i] = -1;
    }
      if(Map[i] == 'X') locationX = i;
     
    }


  std::queue<int> myqueue;
  visited[locationX] = 1;
  myqueue.push(locationX);
  while(!myqueue.empty())
    {
      iVisited = myqueue.front();
      myqueue.pop();
      xDirect = iVisited + 5;
      if((xDirect) < arrCount) 
    if(visited[xDirect] == -1)
      {
        path[xDirect] = path[iVisited] + 1;
        visited[xDirect] = 1;
        myqueue.push(xDirect);
      }
      xDirect = iVisited - 5;
      if((xDirect) >= 0) 
    if(visited[xDirect] == -1)
      {
        path[xDirect] = path[iVisited] + 1;
        visited[xDirect] = 1;
        myqueue.push(xDirect);
      }
      xDirect = iVisited +1;
        if(iVisited%5 != 4) 
    if(visited[xDirect] == -1)
      {
        path[xDirect] = path[iVisited] + 1;
        visited[xDirect] = 1;
        myqueue.push(xDirect);
      }
      xDirect = iVisited - 1;
      if((xDirect) >= 0) 
    if(visited[xDirect] == -1)
      {
        path[xDirect] = path[iVisited] + 1;
        visited[xDirect] = 1;
        myqueue.push(xDirect);
      }

    }
for(int i = 0; i < arrCount; i++)
    {
      if(Map[i] == 'S'&&path[i]<=iPathLen) sum++;
      if(i%5 == 0)printf("
"); printf("%d", path[i]); } printf("
%d
",sum); free(visited); free(path); } int main() { // char map1[] = "S...S.........BS........X"; char map[]="...S........X.S.....S...."; FindStat(map, 5, 3); // FindStat(map1, 5, 5); }