ccf 游戏 bfs

来源:互联网 发布:mac 照片 导出 编辑:程序博客网 时间:2024/06/05 20:27

题意:

这道题蛮好的,以前做bfs基本上都是二维的。

这道题从题面上就能看出来是bfs,我们记录下每个有危险性的点和各自的起始时间和结束时间,然后直接套模板,答案是对的,但会超时。

以前,我们都是用一个数组来标记当前点是否能入队(队列中要保证不能有相同元素)。但这道题,可以从当前点出发,然后经过一系列移动再回来,所以不能直接用二维数组来标记,但是我们发现,再次回来的时候时间是不同的,所以我们可以根据这个性质来设计一个三维数组来标记当前点。http://www.sn180.com/buyer/buyview/1115842824.html

代码:

  1. #include<stdio.h>  
  2. #include<iostream>  
  3. #include<map>  
  4. #include<string.h>  
  5. #include<queue>  
  6. using namespace std;  
  7. typedef pair<int,int>Pa;  
  8. int ma[105][105];  
  9. int flag[105][105];  
  10. int dis[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};  
  11. int vis[105][105][105];  
  12. map<Pa,int>M1,M2;  
  13. int n,m,t;  
  14. struct Node  
  15. {  
  16.     int x;  
  17.     int y;  
  18.     int num;  
  19.     Node(int xx,int yy,int numm)  
  20.     {  
  21.         x=xx;  
  22.         y=yy;  
  23.         num=numm;  
  24.     }  
  25. };  
  26. int bfs()  
  27. {  
  28.     queue<Node>Q;  
  29.     Q.push(Node(1,1,0));  
  30.     vis[1][1][0]=1;  
  31.   
  32.     while(!Q.empty())  
  33.     {cout<<"++"<<endl;  
  34.         Node top=Q.front();  
  35.         Q.pop();  
  36.         if(top.x==n&&top.y==m)  
  37.             return top.num;  
  38.         int nx,ny;  
  39.         for(int i=0; i<4; i++)  
  40.         {  
  41.             nx=top.x+dis[i][1];  
  42.             ny=top.y+dis[i][0];  http://www.sn180.com/buyer/buyview/1115893568.html
  43.             if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&!vis[nx][ny][top.num+1])  
  44.             {  
  45.   
  46.                 if(!M1[make_pair(nx,ny)]&&!M2[make_pair(nx,ny)])  
  47.                 {  
  48.                     Q.push(Node(nx,ny,top.num+1));  
  49.                     vis[nx][ny][top.num+1]=1;  
  50.                 }  
  51.   
  52.                 else if(top.num+1<M1[make_pair(nx,ny)]||top.num+1>M2[make_pair(nx,ny)])  
  53.                 {  
  54.                      Q.push(Node(nx,ny,top.num+1));  
  55.                      vis[nx][ny][top.num+1]=1;  
  56.                 }  
  57.   
  58.             }  
  59.   
  60.   
  61.         }  
  62.     }  
  63.   
  64. }  
  65. int main()  
  66. {  
  67.   
  68.   
  69.     scanf("%d%d%d",&n,&m,&t);  
  70.     int a,b,c,d;  
  71.     for(int i=0; i<t; i++)  
  72.     {  
  73.         scanf("%d%d%d%d",&a,&b,&c,&d);  
  74.         M1[make_pair(a,b)]=c;  
  75.         M2[make_pair(a,b)]=d;  
  76.     }  
  77.     int ans=bfs();  
  78.     printf("%d\n",ans);  
  79. }  
原创粉丝点击