HDU 1728

来源:互联网 发布:淘宝网400电话 编辑:程序博客网 时间:2024/06/07 19:57

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728

普通迷宫增加转弯次数,不知道怎么限制转弯次数,只好按照转一个方向增加一次转弯一搜到底了。。

#include <iostream>           //78ms#include <queue>#include <cstring>using namespace std;int n,m;const int INF = 1e5+666;const int AX = 300;char a[AX][AX];struct  Node{int x;int y;int k;   //记录转弯次数}pos,q;int vis[110][110];int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0},};int bfs(int start_x,int start_y,int end_x,int end_y,int sum){queue<Node>que;pos.k = -1;    //第一次转弯不算所以从-1开始,这个处理是看的别人的 = =。pos.x = start_x;pos.y = start_y;vis[pos.x][pos.y] = 1;que.push(pos);    while(!que.empty())    {        pos=que.front();        if(pos.k>=sum)break;              que.pop();        for(int i=0;i<4;i++)        {            q.x=pos.x+dir[i][0];            q.y=pos.y+dir[i][1];            q.k=pos.k+1;       //从一个点以一个方向搜到不能走                while(a[q.x][q.y]=='.')                {                    if(q.x==end_x&&q.y==end_y)       //到终点就ok啦                    {                        return 1;                    }                    if(vis[q.x][q.y]==0)        //没走过又不标记就ME啦                    {                        vis[q.x][q.y]=1;                         que.push(q);                    }                    q.x+=dir[i][0];     //一搜到底+++++(i是不变的,所以就是按原来的方向走,转弯不存在的)                    q.y+=dir[i][1];                }        }    }    return 0;}int main(){int T;cin>>T;while(T--){memset(a,0,sizeof(a));memset(vis,0,sizeof(vis));cin>>n>>m;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>a[i][j];}}int s_x,s_y,e_x,e_y;int sun;cin>>sun>>s_y>>s_x>>e_y>>e_x;        //输入是反的哦s_y--;s_x--;e_y--,e_x--;           //从0开始-----if(bfs(s_x,s_y,e_x,e_y,sun)){cout<<"yes"<<endl;}else{cout<<"no"<<endl;}}return 0;} 


原创粉丝点击