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