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;
    }


     

  • 相关阅读:
    gojs入门
    chartjs:改变图表的外观
    chart.js入门
    verilog与C语言的6点重大区别
    PCB布线原则【转】_神经火光_百度空间
    verilog中对同一个变量有判断条件的赋值
    同步复位与异步复位——异步复位同步释放
    如何利用TCL文件给FPGA分配引脚
    0欧姆电阻的作用
    独热码
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2363961.html
Copyright © 2011-2022 走看看