圖論之搜尋部分解題思路

來源:互聯網
上載者:User

HDU1728:http://acm.hdu.edu.cn/showproblem.php?pid=1728

該題不難,簡單的BFS,其複雜的地方就是要找出其最小的轉彎次數

#include<iostream>#include<queue>using namespace std;int Sx,Sy,Ex,Ey,T;int visit[101][101];int n,m;char Map[101][101];int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};struct Node{int x;int y;int step; //轉彎次數int dir;}; void BFS(int x,int y){  queue<Node> Q;  Node New;  New.x=x;  New.y=y;  New.step=0;  New.dir=-1;  //構建第一個節點資訊  visit[x][y]=0;  //無轉彎  Q.push(New);  while(!Q.empty())  {  New=Q.front();   Q.pop();    int u;  for(u=0;u<4;u++)  {  Node top=New;  top.x+=dir[u][0];  top.y+=dir[u][1];  if(top.x<1||top.x>n||top.y<1||top.y>m||Map[top.x][top.y]=='*') //越界、越到牆  continue;  if(top.dir!=u&&top.dir!=-1) //轉彎判定,可推演  top.step++;   if(top.step>T) //超出界限,直接跳出,找下一組  continue;  if(top.x==Ex&&top.y==Ey) //找到  {  cout<<"yes"<<endl;  return;  }  if(visit[top.x][top.y]>=top.step) //記錄下轉彎數,併入隊列  {   top.dir=u;  visit[top.x][top.y]=top.step;  Q.push(top);  }  }  }  cout<<"no"<<endl;  return;}int main(){int N;while(cin>>N){while(N--){cin>>n>>m;memset(Map,0,sizeof(Map));int i,j;for(i=1;i<=n;i++)for(j=1;j<=m;j++){cin>>Map[i][j];visit[i][j]=999;  //標記每一個位置的轉彎情況}cin>>T>>Sy>>Sx>>Ey>>Ex;  //行列相反if(Sx==Ex&&Sy==Ey){cout<<"yes"<<endl;continue;}BFS(Sx,Sy); //傳上開始位置}}return 0;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.