poj 1475 推箱子
bfs是一层层的遍历下去,每多一层即为多走一步,因此只要遇到T就停,此时肯定是最小步数。
所以这两层bfs应为,先对箱子的最少步数进行bfs,从而求出推箱子所用最少步数;
然后箱子bfs内部嵌入人的bfs,从而箱子每走一步,判断一下这个移动能否由人来完成(由箱子的移动倒推人应该在的位置,看这个位置是否合理)。
一、http://tech.artyoo.me/?p=282
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <iomanip>
#define read freopen("in.txt","r",stdin)
#define write freopen("out.txt","w",stdout)
using namespace std;
#define MAXSIZE 22
typedef struct {
int bx, by, px, py;
string path;
} Node;
typedef struct {
int x, y;
string path;
} Point;
int row, col;
char grid[MAXSIZE][MAXSIZE];
bool vis[MAXSIZE][MAXSIZE][], vis2[MAXSIZE][MAXSIZE];
Node st;
int caseID;
queue<Node> qb;
queue<Point> qp; const int dx[] = {-, , , };
const int dy[] = {, , -, };
const char Dir[] = {'N', 'S', 'W', 'E'};
const char dir[] = {'n', 's', 'w', 'e'};
string person_path; int Min(int a,int b){return a<b?a:b;}
int Max(int a,int b){return a>b?a:b;} bool bfs_person(Point sp, Point ep, int bx, int by) {
person_path = "";
memset(vis2, false, sizeof(vis2));
while(!qp.empty()) qp.pop();
sp.path = "";
qp.push(sp);
vis2[sp.x][sp.y] = true;
while(!qp.empty()) {
Point now = qp.front(); qp.pop();
if(now.x == ep.x && now.y == ep.y) {
person_path = now.path;
return true;
}
for(int d = ; d < ; d++) {
int x = now.x + dx[d];
int y = now.y + dy[d];
if(x >= && x < row && y >= && y < col && grid[x][y] != '#' && !(x == bx && y == by)) {
if(!vis2[x][y]) {
Point next;
next.x = x;
next.y = y;
next.path = now.path + dir[d];
qp.push(next);
vis2[x][y] = true;
}
}
}
}
return false;
} string bfs_box() {
memset(vis, false, sizeof(vis));
while(!qb.empty()) qb.pop();
qb.push(st);
while(!qb.empty()) {
Node now;
now = qb.front(); qb.pop();
if(grid[now.bx][now.by] == 'T') {
return now.path;
}
for(int d = ; d < ; d++) {
int x = now.bx + dx[d];
int y = now.by + dy[d];
if(x >= && x < row && y >= && y < col && grid[x][y] != '#') {
if(!vis[x][y][d]) {
Point sp, ep; /* sp: 人的当前位置;ep:人要按当前方向推箱子的话必须得到达的位置 */
sp.x = now.px; sp.y = now.py;
ep.x = now.bx; ep.y = now.by;
switch(d) {
case : ep.x += ; break;
case : ep.x -= ; break;
case : ep.y += ; break;
case : ep.y -= ; break;
}
if(ep.x >= && ep.x < row && ep.y >= && ep.y < col && grid[ep.x][ep.y] != '#') {
if(bfs_person(sp, ep, now.bx, now.by)) {
Node next;
next.bx = x; next.by = y;
next.px = now.bx; next.py = now.by;
next.path = now.path + person_path + Dir[d];
qb.push(next);
vis[x][y][d] = true;
}
}
}
}
}
}
return "Impossible.";
} int main() {
read; write;
caseID = ;
while(scanf("%d%d", &row, &col) && row && col) {
getchar();
for(int i = ; i < row; i++) {
gets(grid[i]);
}
for(int i = ; i < row; i++) {
for(int j = ; j < col; j++) {
if(grid[i][j] == 'B') {
st.bx = i;
st.by = j;
grid[i][j] = '.';
} else if(grid[i][j] == 'S') {
st.px = i;
st.py = j;
grid[i][j] = '.';
}
}
}
st.path = "";
printf("Maze #%d\n", ++caseID);
cout << bfs_box() << endl << endl;
}
return ;
}
二、http://www.cnblogs.com/Missa/archive/2012/10/07/2714435.html
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <string> using namespace std; #define MAXN 22
char P[] = { 'N', 'S', 'W', 'E' };
char M[] = { 'n', 's', 'w', 'e' };
int R, C;
int dir[][] = { -, , , , , -, , };//之前当成坐标轴里x,y坐标来算,怎么都不对。后来发现原来x,y是行数和列数。x-1代表到上一行去,即N。
char map[MAXN][MAXN];
struct point
{
int x, y;
int p_x, p_y;//当前状态person所在的地方
string ans;
};
bool isok(int x, int y)
{
if (x >= && x < R && y >= && y < C && map[x][y] != '#')
return true;
return false;
}
string tmp;
bool bfs_person(point en, point cu)
{
tmp = "";
point st;
st.x = en.p_x;
st.y = en.p_y;
st.ans = "";
queue<point>q;
bool vis[MAXN][MAXN];
memset(vis, , sizeof(vis));
while (!q.empty())
q.pop();
q.push(st);
while (!q.empty())
{
point cur, next;
cur = q.front();
q.pop();
if (cur.x == en.x && cur.y == en.y)
{
tmp = cur.ans;
return true;
}
for (int i = ; i < ; i++)
{
next = cur;
next.x = cur.x + dir[i][];
next.y = cur.y + dir[i][];
if (!isok(next.x, next.y)) continue;
if (next.x == cu.x && next.y == cu.y) continue;//cu.x,cu.y is the location of the box.
if (vis[next.x][next.y]) continue;//来过的地方就不能在来了???????莫非bfs都是这样?
vis[next.x][next.y] = ;
next.ans = cur.ans + M[i];
//cout << "M[i] "<<M[i] << endl;
//cout << "cur.ans " << cur.ans << endl;
q.push(next);
}
}
return false;
}
string bfs_box()
{
bool vis[MAXN][MAXN][];//某点四个方向是否访问!!0==N,1==S,2==W,3==E
point st;
st.x = st.y = -;
st.p_x = st.p_y = -;
st.ans = "";
for (int i = ; i < R && (st.x == - || st.p_x == -); i++)
for (int j = ; j < C && (st.x == - || st.p_x == -); j++)
if (map[i][j] == 'B')
{
st.x = i;
st.y = j;
map[i][j] = '.';
}
else if (map[i][j] == 'S')
{
st.p_x = i;
st.p_y = j;
map[i][j] = '.';
}
//----------------------------------------
//cout<<"st.x="<<st.x<<" st.y="<<st.y<<" st.p_x="<<st.p_x<<" st.p_y="<<st.p_y<<endl;
//----------------------------------------
queue<point> q;
while (!q.empty())
q.pop();
q.push(st);
memset(vis, , sizeof(vis));
while (!q.empty())
{
point cur = q.front(); q.pop();
//----------------------------------------
// cout<<"cur.x="<<cur.x<<" cur.y="<<cur.y<<" cur.p_x="<<cur.p_x<<" cur.p_y="<<cur.p_y<<endl;
// cout<<"-----------------------------\n";
//----------------------------------------
point next, pre;
if (map[cur.x][cur.y] == 'T')
return cur.ans;
for (int i = ; i < ; i++)
{
next = cur;
next.x = cur.x + dir[i][];
next.y = cur.y + dir[i][];
if (!isok(next.x, next.y))
continue;
if (vis[next.x][next.y][i])
continue;
pre = cur;
switch (i)
{
case : pre.x = cur.x + ; break;
case : pre.x = cur.x - ; break;
case : pre.y = cur.y + ; break;
case : pre.y = cur.y - ; break;
}
if (!bfs_person(pre, cur))//搜寻人是否能走到特定的位置
continue;
vis[next.x][next.y][i] = ;
next.ans = cur.ans + tmp;
next.ans = next.ans + P[i];
cout << "P[i] " << P[i] << endl;
cout <<"cur--"<< cur.x << "," << cur.y << ";" << cur.p_x << "," << cur.p_y << endl;
cout <<"next--" << next.x << "," << next.y << ";" << next.p_x << "," << next.p_y << endl;
next.p_x = cur.x; next.p_y = cur.y;
q.push(next);
}
}
return "Impossible.";
} int main()
{
int cas = ;
while (scanf("%d%d", &R, &C) && (R + C))
{
getchar();
for (int i = ; i < R; i++)
gets(map[i]); //---------------------------------------
// for(int i=0;i<R;i++)
// cout<<map[i]<<endl;
//---------------------------------------- printf("Maze #%d\n", cas++);
//printf("%s\n",bfs_box());
cout << bfs_box() << endl << endl;
}
return ;
}
poj 1475 推箱子的更多相关文章
- POJ 1475 推箱
推箱 时限:n.2000MS 内存限制:n.131072K 提交材料共计: 6600 接受: 2263 特别法官 描述 想象一下你站在一个二维迷宫里,由方形细胞组成,它们可能或可能不会充满 ...
- POJ1475 推箱子---模块化思想
自古逢秋悲寂寥,我言秋日胜春朝. 晴空一鹤排云上,便引诗情到碧霄. --刘禹锡 题目:推箱子 网址:http://poj.org/problem?id=1475 推箱子游戏相信大家都不陌生,在本题中, ...
- POJ 3009:Curling 2.0 推箱子
Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14090 Accepted: 5887 Desc ...
- poj 1475 || zoj 249 Pushing Boxes
http://poj.org/problem?id=1475 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=249 Pushin ...
- POJ 1475 Pushing Boxes 搜索- 两重BFS
题目地址: http://poj.org/problem?id=1475 两重BFS就行了,第一重是搜索箱子,第二重搜索人能不能到达推箱子的地方. AC代码: #include <iostrea ...
- OC推箱子
#include<stdio.h> #include<stdlib.h> int main(void) { char sr;//存储用户输入的指令 //绘制地图 char a[ ...
- c语言游戏推箱子
前两天做了推箱子小游戏,看似简单的一个小游戏背后却 有巨大的秘密,这秘密就是一大堆逻辑. 自从学习了函数过后,的确是解决了很多问题,而且调用很方便,尽管我现在都不是很会调用. 写完一个函数,准备测试一 ...
- JavaScript写一个小乌龟推箱子游戏
推箱子游戏是老游戏了, 网上有各种各样的版本, 说下推箱子游戏的简单实现,以及我找到的一些参考视频和实例: 推箱子游戏的在线DEMO : 打开 如下是效果图: 这个拖箱子游戏做了移动端的适配, 我使用 ...
- 用C#制作推箱子小游戏
思路分析: 一.制作一个地图 二.地图中放置墙.箱子.人.目标等 三.让小人动起来完成推箱子动作 游戏制作: 1.按照上述地图制作一个地图 (12行×13列) 地图可以看做是行和列组成的,即可以看做 ...
随机推荐
- (转)Python 字符串格式化 str.format 简介
原文:https://www.cnblogs.com/wilber2013/p/4641616.html http://blog.konghy.cn/2016/11/25/python-str-for ...
- kafka多线程消费topic的问题
案例: topic:my-topic,分区:6 消费者:部署三台机器,每台机器上面开启6个线程消费. 消费结果:只有一台机器可以正常消费,另外两台机器直接输出六条告警日志: No broker par ...
- Jmeter创建FTP测试计划
创建FTP测试计划 在这一章,你将学习如何创建一个基础的测试计划来测试FTP站点.你将在一个FTP站点上的两个文件中创建四个用户来发送请求.并且,你将告诉用户运行测试两次.所以,总的请求数是(4个用户 ...
- Go RabbitMQ(四)消息路由
RabbitMQ_Routing 本节内容我们将对发布订阅增加一个特性:订阅子集.比如我们将一些危险的错误消息保存进硬盘中,同时在控制台仍然能够读取所有的消息 Bingings 上一节内容我们将队列跟 ...
- BeanPostProcessor接口
BeanPostProcessor接口及回调方法图 1.InstantiationAwareBeanPostProcessor:实例化Bean后置处理器(继承BeanPostProcessor) po ...
- FusionChart实现柱状图、饼状图的动态数据显示
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 动态页面技术之JSP
1.什么是JSP技术 JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.许多公司参与一起 ...
- 02-Http请求与响应全解
什么是协议 约束双方规范的一个准则 什么是HTTP协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵 ...
- mybatis oracle 顺序模糊匹配
前言:有时需要顺序模糊匹配字段. 用一半的 % 就好: t.item like #{item}||'%'
- Bash拾遗:变量
使用引号包裹变量 在<高级Bash脚本编程指南>中的4.1节中有这么个例子: hello="A B C D" echo $hello # A B C D echo &q ...