hdu1732 Pushbox
来源:互联网 发布:优化系统什么软件好 编辑:程序博客网 时间:2024/05/18 15:52
果断很无语,之前数组开小了一直WA,郁闷死我了。。。表示还是要开8维数组判重,附AC代码:
#include <iostream>
#include <queue>
using namespace std;
const int size = 9 ;
struct Node
{
int x, y;
int Box[3][2];//记录三个箱子的位置
int step;
char map[size][size];
}start;
const int Go[4][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
char map[size][size];
int n, m;
int T_map[size][size];//临时地图
bool visited[size][size][size][size][size][size][size][size];//八维数组,状态判重
Node pre, next;
bool is_finish(Node a)//判断是否每个箱子都入洞
{
return (map[a.Box[0][0]][a.Box[0][1]] == '@' && map[a.Box[1][0]][a.Box[1][1]] == '@' && map[a.Box[2][0]][a.Box[2][1]] == '@' );
}
bool check(int x, int y)
{
return (x >= 0 && x < n && y >= 0 && y < m);
}
int ans;
char Tmap[size][size];//临时地图
void Bfs()
{
queue <Node> Que;
memset(visited, false, sizeof(visited));
Que.push(start);
while (!Que.empty()){
pre = Que.front();
Que.pop();
if (is_finish(pre)){
ans = pre.step;
return ;
}
for (int i = 0; i < 4; i ++){
//将前一个的地图copy到临时地图中
memcpy(Tmap, pre.map, sizeof(Tmap));
Node Tpre = pre;
int xx = Tpre.x + Go[i][0];
int yy = Tpre.y + Go[i][1];
//判断是否入队
if (check(xx, yy) && Tmap[xx][yy] != '#' && !(visited[xx][yy][Tpre.Box[0][0]][Tpre.Box[0][1]][Tpre.Box[1][0]][Tpre.Box[1][1]][Tpre.Box[2][0]][Tpre.Box[2][1]])){
//如果下一个点为箱子的话
if (Tmap[xx][yy] == '*'){
int bx = xx + Go[i][0];
int by = yy + Go[i][1];
//判断箱子能否被推动
if (check(bx, by) && Tmap[bx][by] != '#' && Tmap[bx][by] != '*'){
int ii = 0;
//查找推动的是哪个箱子
for (ii = 0; ii < 3; ii ++){
if (Tpre.Box[ii][1] == yy && Tpre.Box[ii][0] == xx){
break;
}
}
//推动后临时地图该点变为'*'
Tmap[bx][by] = '*';
//原来的两个点都变成'.'
Tmap[pre.x][pre.y] = '.';
Tmap[xx][yy] = '.';
//如果前一个点是'@'(洞)的话
if (T_map[pre.x][pre.y]){
Tmap[pre.x][pre.y] = '@';
}
if (T_map[xx][yy]){
Tmap[xx][yy] = '@';
}
Tpre.Box[ii][1] = by, Tpre.Box[ii][0] = bx;
Tpre.x = xx, Tpre.y = yy;
if ((visited[xx][yy][Tpre.Box[0][0]][Tpre.Box[0][1]][Tpre.Box[1][0]][Tpre.Box[1][1]][Tpre.Box[2][0]][Tpre.Box[2][1]]))continue;
}
else continue;
}
next.x = xx, next.y = yy;
for (int ii = 0; ii < 3; ii ++){
next.Box[ii][0] = Tpre.Box[ii][0];
next.Box[ii][1] = Tpre.Box[ii][1];
}
//入队
next.step = Tpre.step + 1;
visited[xx][yy][Tpre.Box[0][0]][Tpre.Box[0][1]][Tpre.Box[1][0]][Tpre.Box[1][1]][Tpre.Box[2][0]][Tpre.Box[2][1]] = true;
memcpy(next.map, Tmap, sizeof(next.map));
Que.push(next);
}
}
}
}
int main()
{
while (scanf("%d%d", &n, &m) != EOF){
memset(T_map, 0, sizeof(T_map));
ans = -1;
int numB = 0;
for (int i = 0; i < n; i ++){
scanf("%s", map[i]);
for (int j = 0; j < m; j ++){
if (map[i][j] == 'X'){//记录起点
start.x = i, start. y = j;
start.step = 0;
map[i][j] = '.';
}
if (map[i][j] == '*'){//记录箱子
start.Box[numB][0] = i, start.Box[numB ++][1] = j;
}
if (map[i][j] == '@'){//记录洞
T_map[i][j] = 1;
}
}
}
memcpy(start.map, map, sizeof(start.map));
Bfs();
printf("%d/n", ans);
}
return 0;
}
- hdu1732 Pushbox
- hdu1732 Push Box (bfs)
- hdu1732 Push Box ---- BFS
- hdu1732 Push Box【搜索】
- 今儿写了点儿代码
- Struts2学习笔记--注解
- 打靶 (排列组合)
- Android.mk文件语法规范及使用模板
- SharePoint Foundation和SharePoint Server的区别
- hdu1732 Pushbox
- Prinf的输出格式
- Ubuntu+Eclipse CDT+WxWidgets开发环境搭建
- SharePoint 基础知识
- 编译VC静态库中遇到的C2859错误解决方案
- Activity横竖屏切换时的UI处理
- MessageBox的几点用法
- C# 无法立即完成一个非阻挡性套接字操作
- 词频统计系统