bfs加传送机问题

来源:互联网 发布:阿里云主机大学生 编辑:程序博客网 时间:2024/05/21 18:44

hdu2102;
http://acm.hdu.edu.cn/showproblem.php?pid=2102;
题目大意;
1,有两层,里面存在传送机;可以从这层这个位置传送到另外一层的相应位置;
2,在t时间内从左上角(0,0,0)处到达P处;(最优解是否小于t即可);

解题关键;
1;了解bfs的模板及应用;
2;用了三维数组,但一维只有2个正好对应着上下两层,也可以方便实现传送到另外一层相应位置,只需要改变一维下标即可;
3;传送机的处理;
4;队列元素的结构体的构造;(怎样方便简洁);

代码;

#include<stdio.h>#include<string.h>#include<queue>#include<iostream>using namespace std;char mp[2][20][20];//存放地图struct node//结构体包括层数,坐标和时间; {    int x,i,j,t;};int dir[4][2] = {{0,-1},{-1,0},{0,1},{1,0}} ;//四个方向int n, m, time;void bfs(){   queue<node> q;   node p ,d;   int mark[2][20][20]={0};//每个坐标的状态代表是否走过;   mark[0][0][0] = 1;   p.x = 0; p.i=0;p.j=0;p.t=0;//初始地点;    q.push(p);   while(!q.empty())   {       d = q.front();       q.pop();       for(int ii = 0; ii < 4; ii++)       {           p.i = d.i + dir[ii][0];           p.j = d.j + dir[ii][1];           p.x = d.x;           if(p.i>=0 && p.i<n && p.j>=0 && p.j<m && mark[p.x][p.i][p.j]==0&& mp[p.x][p.i][p.j]!='*')           {               if(mp[p.x][p.i][p.j] == '#')               {                   mark[p.x][p.i][p.j] = 1;                   if(p.x==1)p.x=0;                   else     p.x= 1;               }               mark[p.x][p.i][p.j] = 1;               p.t = d.t+1;              //printf("%d %d %d\n",p.x,p.i,p.j);               if(p.t>time){                    printf("NO\n") ; return ;               }                if(mp[p.x][p.i][p.j]=='P'){                        printf("YES\n") ; return ;                }                q.push(p);           }       }   }   printf("NO\n") ;}int main(){    int tt,i,j,k;    scanf("%d",&tt);    while(tt--)    {        cin>>n>>m>>time;        for(i = 0; i < 2; i++)        {            for(j = 0; j < n; j++)            {                for(k = 0; k < m; k++)                {                    cin>>mp[i][j][k];                }            }        }        for(j = 0; j < n; j++)//处理传送机问题;;;         {            for(k = 0; k < m; k++)            {                if(mp[0][j][k]=='#'&&mp[1][j][k]=='*')                    mp[0][j][k] = '*';                if(mp[0][j][k]=='#'&&mp[1][j][k]=='#')                    mp[0][j][k] = mp[1][j][k] = '*';                if(mp[1][j][k]=='#'&&mp[0][j][k]=='*')                    mp[1][j][k] = '*';            }        }        bfs();    }    return 0;}
0 0
原创粉丝点击