HDU 1401 双向BFS !!!
2017-11-01 20:23
573 查看
#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
struct point
{
int x,y;
bool check()
{
if(x<8&&x>=0&&y>=0&&y<8)
return true;
return false;
}
};
struct node
{
point p[4];
int step;
}s,e;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int mat[10][10];
bool cmp(point a,point b)//排序
{
if(a.x!=b.x) return a.x<b.x;
return a.y<b.y;
}
void make_map(node a)//标记4个点的位置
{
mat[a.p[0].x][a.p[0].y]=1;
mat[a.p[1].x][a.p[1].y]=1;
mat[a.p[2].x][a.p[2].y]=1;
mat[a.p[3].x][a.p[3].y]=1;
}
int IsOk(point a)
{
if(mat[a.x][a.y])
return 1;
return 0;
}
char vis[8][8][8][8][8][8][8][8];
void make_vis(node a,char w)//标记状态
{
vis[a.p[0].x][a.p[0].y][a.p[1].x][a.p[1].y][a.p[2].x][a.p[2].y][a.p[3].x][a.p[3].y]=w;
}
char get_vis(node a)//获得状态
{
return vis[a.p[0].x][a.p[0].y][a.p[1].x][a.p[1].y][a.p[2].x][a.p[2].y][a.p[3].x][a.p[3].y];
}
bool bfs()
{
node u,v;
memset(vis,0,sizeof(vis));
make_vis(s,'1');
make_vis(e,'2');
s.step=0;
e.step=0;
queue<node>q,t;
q.push(s);
t.push(e);
while(!q.empty()||!t.empty())
{
if(!q.empty())
{
u=q.front();
q.pop();
memset(mat,0,sizeof(mat));
make_map(u);
if(u.step>=4)
continue;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
v=u;
v.step++;
v.p[j].x+=dir[i][0];
v.p[j].y+=dir[i][1];
if(!v.p[j].check())
continue;
if(IsOk(v.p[j]))//跳步
{
v.p[j].x+=dir[i][0];
v.p[j].y+=dir[i][1];
if(!v.p[j].check())
continue;
}
sort(v.p,v.p+4,cmp);
if(get_vis(v)=='1') continue;
else if(get_vis(v)=='2') return true;//可以到达终点
make_vis(v,'1');
q.push(v);
}
}
}
if(!t.empty())
{
u=t.front();
t.pop();
memset(mat,0,sizeof(mat));
make_map(u);
if(u.step>=4)
continue;
if(get_vis(u)=='1')
return true;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
v=u;
v.step++;
v.p[j].x+=dir[i][0];
v.p[j].y+=dir[i][1];
if(!v.p[j].check())
continue;
if(IsOk(v.p[j]))
{
v.p[j].x+=dir[i][0];
v.p[j].y+=dir[i][1];
if(!v.p[j].check())
continue;
}
sort(v.p,v.p+4,cmp);
if(get_vis(v)=='1') return true;
else if(get_vis(v)=='2') continue;
make_vis(v,'2');
t.push(v);
}
}
}
}
return false;
}
int main()
{
while(~scanf("%d%d",&s.p[0].x,&s.p[0].y))
{
for(int i=1;i<4;i++)
scanf("%d%d",&s.p[i].x,&s.p[i].y);
for(int i=0;i<4;i++)
scanf("%d%d",&e.p[i].x,&e.p[i].y);
for(int i=0;i<4;i++)
{
s.p[i].x--;s.p[i].y--;
e.p[i].x--;e.p[i].y--;
}
sort(s.p,s.p+4,cmp);
sort(e.p,e.p+4,cmp);
bfs()?puts("YES"):puts("NO");
}
return 0;
}
#include<string.h>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
struct point
{
int x,y;
bool check()
{
if(x<8&&x>=0&&y>=0&&y<8)
return true;
return false;
}
};
struct node
{
point p[4];
int step;
}s,e;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int mat[10][10];
bool cmp(point a,point b)//排序
{
if(a.x!=b.x) return a.x<b.x;
return a.y<b.y;
}
void make_map(node a)//标记4个点的位置
{
mat[a.p[0].x][a.p[0].y]=1;
mat[a.p[1].x][a.p[1].y]=1;
mat[a.p[2].x][a.p[2].y]=1;
mat[a.p[3].x][a.p[3].y]=1;
}
int IsOk(point a)
{
if(mat[a.x][a.y])
return 1;
return 0;
}
char vis[8][8][8][8][8][8][8][8];
void make_vis(node a,char w)//标记状态
{
vis[a.p[0].x][a.p[0].y][a.p[1].x][a.p[1].y][a.p[2].x][a.p[2].y][a.p[3].x][a.p[3].y]=w;
}
char get_vis(node a)//获得状态
{
return vis[a.p[0].x][a.p[0].y][a.p[1].x][a.p[1].y][a.p[2].x][a.p[2].y][a.p[3].x][a.p[3].y];
}
bool bfs()
{
node u,v;
memset(vis,0,sizeof(vis));
make_vis(s,'1');
make_vis(e,'2');
s.step=0;
e.step=0;
queue<node>q,t;
q.push(s);
t.push(e);
while(!q.empty()||!t.empty())
{
if(!q.empty())
{
u=q.front();
q.pop();
memset(mat,0,sizeof(mat));
make_map(u);
if(u.step>=4)
continue;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
v=u;
v.step++;
v.p[j].x+=dir[i][0];
v.p[j].y+=dir[i][1];
if(!v.p[j].check())
continue;
if(IsOk(v.p[j]))//跳步
{
v.p[j].x+=dir[i][0];
v.p[j].y+=dir[i][1];
if(!v.p[j].check())
continue;
}
sort(v.p,v.p+4,cmp);
if(get_vis(v)=='1') continue;
else if(get_vis(v)=='2') return true;//可以到达终点
make_vis(v,'1');
q.push(v);
}
}
}
if(!t.empty())
{
u=t.front();
t.pop();
memset(mat,0,sizeof(mat));
make_map(u);
if(u.step>=4)
continue;
if(get_vis(u)=='1')
return true;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
v=u;
v.step++;
v.p[j].x+=dir[i][0];
v.p[j].y+=dir[i][1];
if(!v.p[j].check())
continue;
if(IsOk(v.p[j]))
{
v.p[j].x+=dir[i][0];
v.p[j].y+=dir[i][1];
if(!v.p[j].check())
continue;
}
sort(v.p,v.p+4,cmp);
if(get_vis(v)=='1') return true;
else if(get_vis(v)=='2') continue;
make_vis(v,'2');
t.push(v);
}
}
}
}
return false;
}
int main()
{
while(~scanf("%d%d",&s.p[0].x,&s.p[0].y))
{
for(int i=1;i<4;i++)
scanf("%d%d",&s.p[i].x,&s.p[i].y);
for(int i=0;i<4;i++)
scanf("%d%d",&e.p[i].x,&e.p[i].y);
for(int i=0;i<4;i++)
{
s.p[i].x--;s.p[i].y--;
e.p[i].x--;e.p[i].y--;
}
sort(s.p,s.p+4,cmp);
sort(e.p,e.p+4,cmp);
bfs()?puts("YES"):puts("NO");
}
return 0;
}
相关文章推荐
- hdu 1401 双向bfs
- HDU 1401 Solitaire 双向BFS
- hdu 1401 Solitaire 双向bfs
- HDU_1401——同步双向BFS,八进制位运算压缩,map存放hash
- HDU 1401 Solitaire 双向BFS
- HDU 1401 Solitaire(双向BFS)
- hdu 1401 双向搜索(bfs)
- HDU_1401——分步双向BFS,八进制乘权值压缩,map存放hash
- hdu 1401 Solitaire(双向bfs)
- HDU 1401 Solitaire [双向BFS]
- HDU_1401——分步双向BFS,八进制位运算压缩,map存放hash
- HDU 1043 && POJ 1077 Eight bfs || 双向bfs || A*搜索
- HDOJ 题目1401 Solitaire(双向BFS)
- HDU 3081 Nightmare Ⅱ(双向BFS)
- 第十场 hdu 6171 Admiral(双向bfs找交点)
- HDU 1401 Solitaire(双向广度优先搜索)
- hdu1043八数码 bfs 打表/双向bfs/A*+康托判重+逆序奇偶剪枝
- HDU 6171 Admiral [双向bfs+hash]
- HDU 3085 Nightmare Ⅱ(双向BFS)
- hdu 5440 Clock Adjusting(双向bfs)