程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Hoj 1030 Labyrinth

Hoj 1030 Labyrinth

編輯:C++入門知識

要求在圖中找出距離最遠的兩個點的距離。   這題暴力枚舉每一點出發的最長路徑顯然不可行。 從任意點A出發的最長路徑的另一個端點稱為B,那麼B就是全局最長路徑的一個端點。那麼,從B點開始一次廣搜,到達的最遠點叫C。BC即是圖中的最長路徑。       [cpp]   #include <iostream>   #include <math.h>   #include <stdio.h>   #include <string.h>   #include <queue>   #include <algorithm>   #include <stack>      using namespace std;      int column,row;   int map[1002][1002];   int dis[1002][1002];   int disx[4] = {0,1,0,-1};   int disy[4] = {1,0,-1,0};      int maxX;   int maxY;         struct Point   {       int x;       int y;   };      int bfs(int startx,int starty)   {       queue<Point> p;       Point nex,temp;          maxX = startx;       maxY = starty;       int maxP = 0;          nex.x = startx;       nex.y = starty;       p.push(nex);       while(!p.empty())       {           temp = p.front();           p.pop();           for(int i=0; i<4; i++)           {               int tempx = temp.x + disx[i];               int tempy = temp.y + disy[i];                  if(tempx>=0 && tempx<row && tempy>=0 && tempy<column)               {                   if(map[tempx][tempy] == 1)                   {                       map[tempx][tempy] = 2;                       dis[tempx][tempy] += dis[temp.x][temp.y] + 1;                       nex.x = tempx;                       nex.y = tempy;                       p.push(nex);                       if(dis[tempx][tempy]>maxP)                       {                           maxP = dis[tempx][tempy];                           maxX = tempx;                           maxY = tempy;                       }                   }               }           }       }       return maxP;   }      int main()   {   #ifndef ONLINE_JUDGE       freopen("in.txt","r",stdin);   #endif       int t;       char c;       scanf(" %d ",&t);       int startx,starty;       while(t--)       {           memset(map,0,sizeof(map));           memset(dis,0,sizeof(dis));           scanf(" %d %d ",&column,&row);           for(int i=0; i<row; i++)           {               for(int j=0; j<column; j++)               {                   scanf(" %c ",&c);                   if(c == '.')                   {                       map[i][j] = 1;                   }               }           }              for(int i=0; i<row; i++)           {               int flag = 0;               for(int j=0; j<column; j++)               {                   if(map[i][j] == 1)                   {                       flag = 1;                       startx = i;                       starty = j;                       break;                   }               }               if(flag == 1)               {                   break;               }           }           map[startx][starty] = 2;//標記為已訪問過              bfs(startx,starty);              //還原原map           for(int i=0; i<row; i++)           {  www.2cto.com             for(int j=0; j<column; j++)               {                   if(map[i][j] == 2)                   {                       map[i][j] = 1;                   }               }           }           memset(dis,0,sizeof(dis));           printf("Maximum rope length is %d.\n",bfs(maxX,maxY));          }          return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved