zoukankan      html  css  js  c++  java
  • hdu 2531

    起初没有看懂题目,无处下手,就去翻翻别人的代码,才知道题目的意思,汗……

    简单的一般的广搜的变形,这个解释的比较详细http://blog.csdn.net/swm8023/article/details/6765219

    虽然知道怎么做了,但是还是犯错误,最后与上面这份代码比较之后才找出错误

    #include <iostream>
    #include <cstring>
    #include <queue>
    using namespace std;

    char map[102][102];
    int vis[102][102];
    int n,m,time,ans;
    int fx[21],fy[21],lx,ly;
    int dx[4]={-1,0,1,0};
    int dy[4]={0,1,0,-1};

    struct node
    {
     int x,y;
     node(int a,int b)//这样用比较方便,但是注意声明node结构体的时候要注意,因为这个是构造函数,所以声明的时候要按构造函数的模式声明。
     {
      x=a;
      y=b;
     }
    };

    queue<node> q;

    void bfs()
    {
     int i,j;
     int nnx,nny;
     int nx,ny;
     
     while(!q.empty())
     {
      node add=q.front();
      q.pop();
      
      int k;
      //cout<<add.x<<" "<<add.y<<endl;
      for(i=0;i<4;i++)
      {
       k=0;
       nnx=add.x+dx[i];
       nny=add.y+dy[i];
       if(vis[nnx][nny]==0)//先判断是否可行
       {
        for(j=0;j<ans;j++)
        {
         //cout<<"*"<<fx[j]<<" "<<fy[j]<<endl;
         nx=fx[j]-lx+nnx;
         ny=fy[j]-ly+nny;//郁闷,今天竟然两次犯这种错误:把y写成了x,经过认认真真的检查才查出来……坑爹的说,是自己敲代码的时候太不用心了……
         //cout<<"**"<<nx<<" "<<ny<<endl;
         if(nx<1||nx>n||ny<1||ny>m)//还有这里:黄色部分必须在前面,而不应该在这里加vis[nx][ny]!=0,因为有可能这一步是前面的身体部分走过的,会出现误判……
         {
          k=1;
          break;
         }
         if(map[nx][ny]=='O')
         {
          k=1;
          break;
         }

    if(map[nx][ny]=='Q')
          {
           k=2;
              }

        }

       }
       else
        k=1;
       if(k==2)
       {
        time=vis[add.x][add.y];
        return;
       }
       else if(k==1)
       {
        continue;
       }
       else
       {
        vis[nnx][nny]=vis[add.x][add.y]+1;
        q.push(node(nnx,nny));
       }
      }
     }
    }

    int main()
    {
     while(cin>>n>>m)
     {
      if(!n&&!m)
       break;
      int i,j;
      lx=0,ly=0;
      ans=0;
      
      for(i=1;i<=n;i++)
      {
       for(j=1;j<=m;j++)
       {
        cin>>map[i][j];
        if(map[i][j]=='D')
        {
         fx[ans]=i;
         fy[ans++]=j;
         if(!lx&&!ly)
         {
          lx=i;
          ly=j;
         }
        }
       }
      }
      if(!lx||!ly)
      {
       cout<<"Impossible"<<endl;
       continue;
      }
      
      //cout<<ans<<endl;
      memset(vis,0,sizeof(vis));
      
      while(!q.empty())
       q.pop();
      
      time=1000000;
      vis[lx][ly]=1;
      
      q.push(node(lx,ly));
      bfs();
      
      if(time<1000000)
       cout<<time<<endl;
      else
       cout<<"Impossible"<<endl;
      
     }
     
     return 0;
    }


     

  • 相关阅读:
    POJ 3041 Asteroids 最小点覆盖 == 二分图的最大匹配
    POJ 3083 Children of the Candy Corn bfs和dfs
    POJ 2049 Finding Nemo bfs 建图很难。。
    POJ 2513 Colored Sticks 字典树、并查集、欧拉通路
    POJ 1013 Counterfeit Dollar 集合上的位运算
    POJ 2965 The Pilots Brothers' refrigerator 位运算枚举
    无聊拿socket写的100以内的加法考试。。。
    POJ 1753 Flip Game
    初学socket,c语言写的简单局域网聊天
    汇编语言 复习 第十一章 标志寄存器
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2363961.html
Copyright © 2011-2022 走看看