作者在 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;
#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;
};
{
public:
int num;
int x;
int y;
};
struct Comp
{
bool operator () (const inode& left,const inode& right) const
{
return left.num > right.num;
}
};
{
bool operator () (const inode& left,const inode& right) const
{
return left.num > right.num;
}
};
//typedef struct st
//{
// int x;
// int y;
//}ST;
int xx,yy;
int hx=0;
int hy=0;
int hx=0;
int hy=0;
NN grid[maxn][maxn];
bool get_in()
{
int m,n,x,y,d,l;
cin >>m>>n;
if(m<0&&n<0)
return false;
while(m--)
{
cin >>x>>y>>d>>l;
if(1==d)
{
if(hy<y+l)
hy=y+l;
{
int m,n,x,y,d,l;
cin >>m>>n;
if(m<0&&n<0)
return false;
while(m--)
{
cin >>x>>y>>d>>l;
if(1==d)
{
if(hy<y+l)
hy=y+l;
for(int i=0;i<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<l;i++)
{
grid[x+i][y].d=true;
if(y-1>=0)
grid[x+i][y-1].u=true;
}
}
}
while(n--)
{
cin >>x>>y>>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>=0)
grid[x-1][y].rr=true;
}
else
{
hx=hx<x?x:hx;
if(hx<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>=0)
grid[x][y-1].ur=true;
}
{
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<l;i++)
{
grid[x+i][y].d=true;
if(y-1>=0)
grid[x+i][y-1].u=true;
}
}
}
while(n--)
{
cin >>x>>y>>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>=0)
grid[x-1][y].rr=true;
}
else
{
hx=hx<x?x:hx;
if(hx<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>=0)
grid[x][y-1].ur=true;
}
}
double temp;
cin >>temp;
xx=temp;
cin >>temp;
yy=temp;
return true;
}
void bfs()
{
if(xx>hx&&yy>hy)
{
grid[xx][yy].num=0;
return ;
}
priority_queue <inode,vector<inode>,Comp> 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>=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>=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<=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<maxn;i++)
for(int j=0;j<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<<grid[xx][yy].num<<endl;
return ;
}
int main()
{
inital();
while(get_in())
{
if(xx>199||xx<1||yy>199||yy<1)
{
cout<<"0"<<endl;
}
else
{
bfs();
get_out();
}
inital();
}
return 0;
}
double temp;
cin >>temp;
xx=temp;
cin >>temp;
yy=temp;
return true;
}
void bfs()
{
if(xx>hx&&yy>hy)
{
grid[xx][yy].num=0;
return ;
}
priority_queue <inode,vector<inode>,Comp> 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>=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>=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<=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<maxn;i++)
for(int j=0;j<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<<grid[xx][yy].num<<endl;
return ;
}
int main()
{
inital();
while(get_in())
{
if(xx>199||xx<1||yy>199||yy<1)
{
cout<<"0"<<endl;
}
else
{
bfs();
get_out();
}
inital();
}
return 0;
}