HDU 1254—— 推箱子
2014-03-08 21:47
316 查看
宽搜
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
#define INF (1<<30)
struct Node
{
int x,y;
int step;
int dir;
Node(){}
Node(int xx,int yy)
{
x=xx;
y=yy;
}
Node(int xx,int yy,int ss,int dd)
{
x=xx;
y=yy;
step=ss;
dir=dd;
}
};
int n,m;
int map[10][10];
int vis[10][10][4];
int dir[4][2]={-1,0,0,1,1,0,0,-1};
int bfsvis[10][10];
int judge(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]!=1)
return 1;
return 0;
}
int find(Node a,Node b,Node box)
{
if(a.x==b.x&&a.y==b.y)
return 1;
queue<Node> q;
memset(bfsvis,0,sizeof(bfsvis));
bfsvis[a.x][a.y]=1;
bfsvis[b.x][b.y]=2;
q.push(a);
q.push(b);
while(!q.empty())
{
Node u=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=u.x+dir[i][0];
int y=u.y+dir[i][1];
if(judge(x,y)&&(x!=box.x||y!=box.y))
{
if(bfsvis[x][y]==0)
{
bfsvis[x][y]=bfsvis[u.x][u.y];
q.push(Node(x,y));
}
else
if(bfsvis[x][y]!=bfsvis[u.x][u.y])
return 1;
}
}
}
return 0;
}
int bfs(Node start,Node end,Node now)
{
queue<Node> q;
memset(vis,0,sizeof(vis));
for(int i=0;i<4;i++)
{
int x=start.x+dir[i][0];
int y=start.y+dir[i][1];
if(judge(start.x+dir[(i+2)%4][0],start.y+dir[(i+2)%4][1])&&judge(x,y)&&find(Node(x,y),now,start))
{
vis[start.x][start.y][i]=1;
q.push(Node(start.x+dir[(i+2)%4][0],start.y+dir[(i+2)%4][1],1,i));
}
}
while(!q.empty())
{
Node u=q.front();
q.pop();
if(u.x==end.x&&u.y==end.y)
return u.step;
for(int i=0;i<4;i++)
{
int x=u.x+dir[i][0];
int y=u.y+dir[i][1];
Node tmp(u.x+dir[u.dir][0],u.y+dir[u.dir][1]);
if(judge(u.x+dir[(i+2)%4][0],u.y+dir[(i+2)%4][1])&&judge(x,y)&&vis[u.x][u.y][i]==0&&find(Node(x,y),tmp,u))
{
vis[u.x][u.y][i]=1;
q.push(Node(u.x+dir[(i+2)%4][0],u.y+dir[(i+2)%4][1],u.step+1,i));
}
}
}
return -1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
Node start,end,now;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
start.x=i,start.y=j;
if(map[i][j]==3)
end.x=i,end.y=j;
if(map[i][j]==4)
now.x=i,now.y=j;
}
int ans=bfs(start,end,now);
printf("%d\n",ans);
}
return 0;
}
/*
44
4 4
0 0 0 1
0 1 0 1
2 1 0 0
0 4 1 3*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
#define INF (1<<30)
struct Node
{
int x,y;
int step;
int dir;
Node(){}
Node(int xx,int yy)
{
x=xx;
y=yy;
}
Node(int xx,int yy,int ss,int dd)
{
x=xx;
y=yy;
step=ss;
dir=dd;
}
};
int n,m;
int map[10][10];
int vis[10][10][4];
int dir[4][2]={-1,0,0,1,1,0,0,-1};
int bfsvis[10][10];
int judge(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]!=1)
return 1;
return 0;
}
int find(Node a,Node b,Node box)
{
if(a.x==b.x&&a.y==b.y)
return 1;
queue<Node> q;
memset(bfsvis,0,sizeof(bfsvis));
bfsvis[a.x][a.y]=1;
bfsvis[b.x][b.y]=2;
q.push(a);
q.push(b);
while(!q.empty())
{
Node u=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=u.x+dir[i][0];
int y=u.y+dir[i][1];
if(judge(x,y)&&(x!=box.x||y!=box.y))
{
if(bfsvis[x][y]==0)
{
bfsvis[x][y]=bfsvis[u.x][u.y];
q.push(Node(x,y));
}
else
if(bfsvis[x][y]!=bfsvis[u.x][u.y])
return 1;
}
}
}
return 0;
}
int bfs(Node start,Node end,Node now)
{
queue<Node> q;
memset(vis,0,sizeof(vis));
for(int i=0;i<4;i++)
{
int x=start.x+dir[i][0];
int y=start.y+dir[i][1];
if(judge(start.x+dir[(i+2)%4][0],start.y+dir[(i+2)%4][1])&&judge(x,y)&&find(Node(x,y),now,start))
{
vis[start.x][start.y][i]=1;
q.push(Node(start.x+dir[(i+2)%4][0],start.y+dir[(i+2)%4][1],1,i));
}
}
while(!q.empty())
{
Node u=q.front();
q.pop();
if(u.x==end.x&&u.y==end.y)
return u.step;
for(int i=0;i<4;i++)
{
int x=u.x+dir[i][0];
int y=u.y+dir[i][1];
Node tmp(u.x+dir[u.dir][0],u.y+dir[u.dir][1]);
if(judge(u.x+dir[(i+2)%4][0],u.y+dir[(i+2)%4][1])&&judge(x,y)&&vis[u.x][u.y][i]==0&&find(Node(x,y),tmp,u))
{
vis[u.x][u.y][i]=1;
q.push(Node(u.x+dir[(i+2)%4][0],u.y+dir[(i+2)%4][1],u.step+1,i));
}
}
}
return -1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
Node start,end,now;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
start.x=i,start.y=j;
if(map[i][j]==3)
end.x=i,end.y=j;
if(map[i][j]==4)
now.x=i,now.y=j;
}
int ans=bfs(start,end,now);
printf("%d\n",ans);
}
return 0;
}
/*
44
4 4
0 0 0 1
0 1 0 1
2 1 0 0
0 4 1 3*/
相关文章推荐
- 将GEO的soft 数据转换为expression matrix
- php服务器的搭建和thinksns的安装
- HDU 2492 Ping pong
- Servlet监听和软件国际化
- nginx+keepalived+tomcat之具体配置档
- 调试怪现象之领悟
- 第三章 LALR(1)的构造
- 为你的web加上fckeditor在线编辑器
- tcp/ip协议学习笔记(8)TCP传输控制协议
- 如何机算?
- 怎样用UltraISO制作U盘系统安装盘
- 黑马程序员 java多态
- Cacti插件详解之――Weathermap(2)
- 在线代码校验及格式化
- 归并排序
- ACM资料
- C# Windows Phone App 开发,修改【锁定画面】,从【Assets】、【UI】、【网路图片】,并解决失灵问题。
- 问卷调查功能中的题目编辑功能
- 利用SIPp对SIP Proxy进行Register压测用到的文件
- C# Windows Phone App 开发,自制LockScreen 锁定画面类别(Class),从【网路图片】、【Assets资源】、【UI】修改锁定画面。