zoukankan      html  css  js  c++  java
  • Finding Nemo(搜索)

    http://poj.org/problem?id=2049

    题意:有一个迷宫,迷宫中有墙、门和空地。有M道墙,每一道墙用(x,y,d,t)表示,(x,y)表示墙的起始坐标,(d=1,t)表示向上t个单位都是墙;(d=0,t)表示向右t个单位都是墙。

    有N扇门,用(x,y,d)表示,(x,y)表示门的起始坐标,d=1,表示向上一个单位都是门;d=0,表示向右一个单位都是门。 给出Nemo的起始位置(f1,f2),问起点到(0,0)的最少要穿过的门。

    表示对搜索的题很晕。。看到题不知道该怎么存,看了别人的题解才懂点。。

      1 #include <stdio.h>
      2 #include <algorithm>
      3 #include <string.h>
      4 #include <queue>
      5 using namespace std;
      6 const int INF=1<<28;
      7 const int N=220;
      8 int dir[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};
      9 int xx[N][N],yy[N][N];
     10 int dis[N][N];
     11 int max_x,max_y;
     12 int boundary(int x,int y)//边界判断
     13 {
     14     if(x>0 && x<=max_x && y<=max_y && y>0)
     15         return 1;
     16     return 0;
     17 }
     18 int change(int x,int y,int d)//方向转换
     19 {
     20     if(d==0) return yy[x-1][y];
     21     if(d==1) return yy[x][y];
     22     if(d==2) return xx[x][y-1];
     23     return xx[x][y];
     24 }
     25 int bfs(int x,int y)
     26 {
     27     queue<int>q;
     28     while(!q.empty()) q.pop();
     29     for (int i = 1; i <= max_y; i++)
     30     {
     31         for (int j = 1; j <= max_x; j++)
     32             dis[i][j] = INF;
     33     }
     34     dis[1][1]=0;
     35     q.push(1);
     36     q.push(1);
     37     while(!q.empty())
     38     {
     39         int x1=q.front();
     40         q.pop();
     41         int y1=q.front();
     42         q.pop();
     43         for (int i = 0; i < 4; i++)
     44         {
     45             int dx = x1+dir[i][0];
     46             int dy = y1+dir[i][1];
     47             int turn = change(x1,y1,i);
     48             if(boundary(dx,dy) && dis[dx][dy]>dis[x1][y1]+turn)
     49             {
     50                 dis[dx][dy]=dis[x1][y1]+turn;//更新最小步数
     51                 q.push(dx);
     52                 q.push(dy);
     53             }
     54         }
     55     }
     56     int ans = dis[x][y]==INF?-1:dis[x][y];
     57     return ans;
     58 }
     59 int main()
     60 {
     61     int n,m;
     62     int x,y,d,l;
     63     while(~scanf("%d%d",&n,&m))
     64     {
     65         if(n==-1&&m==-1) break;
     66         max_x = max_y = -1;
     67         memset(xx,0,sizeof(xx));
     68         memset(yy,0,sizeof(yy));
     69         for (int i = 0; i < n; i++)
     70         {
     71             scanf("%d%d%d%d",&x,&y,&d,&l);
     72             if(d)
     73             {
     74                 for (int j = 0; j < l; j++)
     75                     yy[x][y+j+1]=INF;
     76                 max_y=max(y+l+1,max_y);
     77                 max_x=max(x+1,max_x);
     78             }
     79             else
     80             {
     81                 for (int j = 0; j < l; j++)
     82                 {
     83                     xx[x+j+1][y]=INF;
     84                     max_y=max(y+1,max_y);
     85                     max_x=max(x+l+1,max_x);
     86                 }
     87             }
     88         }
     89         for (int i = 0; i < m; i++)
     90         {
     91             scanf("%d%d%d",&x,&y,&d);
     92             if(d) yy[x][y+1]=1;
     93             else  xx[x+1][y]=1;
     94         }
     95         double sx,sy;
     96         int sx1,sy1;
     97         scanf("%lf%lf",&sx,&sy);
     98         sx1 = (int)sx+1;
     99         sy1 = (int)sy+1;
    100         if(!(sx>=1 && sx<=199 && sy>=1 && sy<=199))//Nemo可能在迷宫外
    101             printf("0
    ");
    102         else
    103             printf("%d
    ",bfs(sx1,sy1));
    104     }
    105     return 0;
    106 }
    View Code
  • 相关阅读:
    JS 保存表单默认值 为空时自动填充默认值
    .net 防盗链
    Subversion安装和使用
    (转) MFC的入口点与消息循环,消息映射
    ASP.NET树形控件TreeView的递归绑定
    SQL Server中的分页
    C# 调用WebService的方法
    从零开始定义自己的JavaScript框架(一)
    JS中的call和apply
    JS中的自执行函数
  • 原文地址:https://www.cnblogs.com/lahblogs/p/3565377.html
Copyright © 2011-2022 走看看