pku(2049) Finding Nemo

作者在 2008-06-10 01:49:22 发布以下内容
首先,我认为他是邪恶的,有一组邪恶的数据,害我wa了很多次。
 
方法就是使用贪心+bfs来实现的。
 
主要是要先把度数的点搜索之后在去搜索其他点。
 
这题花了我一晚上,几下来的时候都快两点了。
 
 
#include <iostream>
#include <queue>
using namespace std;
const int maxn=210;
typedef struct nn
{
 bool u;
 bool d;
 bool l;
 bool r;
 bool index;
 int num;
 bool ur;
 bool dr;
 bool lr;
 bool rr;
 
}NN;
class inode
{
public:
 int num;
 int x;
 int y;
 
};
struct Comp
{
  bool operator () (const inode& left,const inode& right) const
 {
  return left.num &gt; right.num;
 }
};

//typedef struct st
//{
// int x;
// int y;
//}ST;
int xx,yy;
int hx=0;
int hy=0;
NN grid[maxn][maxn];
bool get_in()
{
 int m,n,x,y,d,l;
 cin &gt;&gt;m&gt;&gt;n;
 if(m<0&&n&lt;0)
  return false;
 while(m--)
 {
  cin >&gt;x&gt;&gt;y&gt;&gt;d&gt;&gt;l;
  if(1==d)
  {
   if(hy<y+l)
    hy=y+l;
      for(int i=0;i&lt;l;i++)
   {
    grid[x][y+i].l=true;
    if(x-1>=0)
       grid[x-1][y+i].r=true;
   }
  }
  else
  {
   if(hx<x+l)
    hx=x+l;
   for(int i=0;i&lt;l;i++)
   {
    grid[x+i][y].d=true;
    if(y-1>=0)
       grid[x+i][y-1].u=true;
   }
  }
 }
 while(n--)
 {
  cin &gt;&gt;x&gt;&gt;y&gt;&gt;d;
  if(1==d)
  {
   hy=hy<y?y:hy;
     grid[x][y].l=false;
     if(x-1>=0)
     grid[x-1][y].r=false;
     grid[x][y].lr=true;
     if(x-1&gt;=0)
     grid[x-1][y].rr=true;
  }
  else
  {
   hx=hx<x?x:hx;
   if(hx&lt;x)
    hx=x;
   grid[x][y].d=false;
   if(y-1>=0)
   grid[x][y-1].u=false;
   grid[x][y].dr=true;
   if(y-1&gt;=0)
      grid[x][y-1].ur=true;
  }
 }
 double temp;
 cin &gt;&gt;temp;
 xx=temp;
 cin &gt;&gt;temp;
 yy=temp;
 return true;
}
void bfs()
{
 if(xx&gt;hx&&yy&gt;hy)
 {
  grid[xx][yy].num=0;
  return ;
 }
 priority_queue <inode,vector&lt;inode>,Comp&gt; list;
// queue <inode> list;
 inode temp;
 temp.x=0;
 temp.y=0;
 temp.num=0;
 list.push(temp);
    grid[0][0].num=0;
 grid[0][0].index=true;
 while(1)
 {
 if(list.empty())
 {
  grid[xx][yy].num=-1;
  return ;
 }
 int tempnum=list.top().num;
    int x=list.top().x;
 int y=list.top().y;
 list.pop();
  if(x-1&gt;=0&&!grid[x][y].l&&!grid[x-1][y].index)
  {
   if(grid[x][y].lr)
   grid[x-1][y].num=grid[x][y].num+1;
   temp.x=x-1;
   temp.y=y;
   temp.num=grid[x-1][y].num;
   list.push(temp);
   grid[x-1][y].index=true;
   if(xx==x-1&&yy==y)
        return ;
  }
  if(y-1&gt;=0&&!grid[x][y].d&&!grid[x][y-1].index)
  {
   if(grid[x][y].dr)
   grid[x][y-1].num=grid[x][y].num+1;
   temp.x=x;
   temp.y=y-1;
   temp.num=grid[x][y-1].num;
   list.push(temp);
   grid[x][y-1].index=true;
   if(xx==x&&yy==y-1)
         return ;
  }
  if(x+1<=hx+1&&!grid[x][y].r&&!grid[x+1][y].index)
  {
   if(grid[x][y].rr)
   grid[x+1][y].num=grid[x][y].num+1;
   temp.x=x+1;
   temp.y=y;
   temp.num=grid[x+1][y].num;
   list.push(temp);
   grid[x+1][y].index=true;
   if(xx==x+1&&yy==y)
         return ;
  }
  if(y+1&lt;=hy+1&&!grid[x][y].u&&!grid[x][y+1].index)
  {
   if(grid[x][y].ur)
   grid[x][y+1].num=grid[x][y].num+1;
   temp.x=x;
   temp.y=y+1;
   temp.num=grid[x][y+1].num;
   list.push(temp);
   grid[x][y+1].index=true;
   if(xx==x&&yy==y+1)
         return ;
  }
 }
 return ;
}
void inital()
{
 hx=0;
 hy=0;
 for(int i=0;i&lt;maxn;i++)
  for(int j=0;j&lt;maxn;j++)
  {
   grid[i][j].u=false;
   grid[i][j].d=false;
   grid[i][j].l=false;
   grid[i][j].r=false;
   grid[i][j].index=false;
   grid[i][j].num=0;
   grid[i][j].ur=false;
   grid[i][j].dr=false;
   grid[i][j].lr=false;
   grid[i][j].rr=false;
  }
  return ;
}
void get_out()
{
 cout&lt;&lt;grid[xx][yy].num&lt;&lt;endl;
 return ;
}
int main()
{
 inital();
 while(get_in())
 {
 if(xx>199||xx<1||yy>199||yy&lt;1)
 {
  cout&lt;&lt;"0"&lt;&lt;endl;
 }
 else
 {
 bfs();
 get_out();
 }
 inital();
 }
 return 0;
}
acm | 阅读 5571 次
文章评论,共0条
游客请输入验证码
浏览260760次