临近毕业真是各种琐事多,好不容易写完几万字蛋疼的论文,又接着户口档案挂靠,毕业旅游,20多个离校盖章,签证被check了几个星期还没消息,希望8月初能走啊。

各种事情之下,人就是懒加心散,好久没写代码,也时间写,再说也不知道写啥。突然心血来潮还是刷刷题,不然都忘记代码怎么写了。

Poj33222,Bloxorz,一个很有意思的小游戏,一道中等的搜索题目。该题目也是相关游戏的AI算法的一个典型思路:利用BFS或者DFS来不断搜索下一步所有可能的游戏状态,继而找到解(像推箱子都可以用类似思路解决),为了加速可以利用剪枝,常量表等技巧。不过不知道为啥一开始用Java没过,后来无奈,语法稍微改成C++就过了。。POJ的神奇。。

#include <iostream>
#include<algorithm>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std; //------>y
//|
//|
//|
//x class Node
{
public:
int lx,ly;
bool stand;
bool horizontal;
int t; Node()
{ } Node(int x,int y,bool s,bool h, int t)
{
this->lx = x;
this->ly = y;
this->stand = s;
this->horizontal = h;
this->t = t;
}
}; char map[501][501];
int visMat[502][502][3] ;//0:stand 1:horizontal 2:vertical
const int MAX = 1<<30; bool TestLie(int lx, int ly, bool hFlag, int r, int c)
{
if(lx<0 || lx >=r || ly<0 || ly>=c)
{
return false;
} if(hFlag == true)
{
if(ly < c-1)
{
if( (map[lx][ly] != '#') && (map[lx][ly+1] != '#') )
return true;
}
} else//lie vertically
{
if(lx < r-1)
{
if( (map[lx][ly] != '#') && (map[lx+1][ly] != '#') )
return true;
}
} return false;
} bool TestStand(int lx, int ly, int r, int c)
{
if(lx>=0 && ly>=0 && lx < r && ly < c && map[lx][ly]!='#' && map[lx][ly]!='E')
return true; return false;
} int BFSearch(int r,int c,Node sNode, int ex,int ey)
{
int visNum = -1; queue<Node> nodeQueue;
nodeQueue.push(sNode); while(nodeQueue.empty() == false)
{
Node node = nodeQueue.front();
nodeQueue.pop(); /////////////////Test if it meets the end/////////////////////////
if(node.stand == true && node.lx == ex && node.ly == ey)
{
//Find the solution.
visNum = visMat[node.lx][node.ly][0];
break;
} //System.out.println(node.lx+" "+node.ly+" "+node.stand+" "+node.horizontal+" "+node.t); ////////////////////////////////////////////////////////////////// if(node.stand == true)//stand
{
//lie vertical up
if(TestLie((node.lx - 2), node.ly, false, r, c)
&&
node.t + 1 < visMat[node.lx-2][node.ly][2])
{
Node tNode((node.lx-2), node.ly, false, false, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx-2][node.ly][2] = node.t + 1;
} //lie vertical down
if(TestLie((node.lx + 1), node.ly, false, r, c)
&&
node.t + 1 < visMat[node.lx+1][node.ly][2])
{
Node tNode((node.lx+1), node.ly, false, false, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx+1][node.ly][2] = node.t + 1;
} //lie horizontal left
if(TestLie(node.lx, (node.ly - 2), true, r, c)
&&
node.t + 1 < visMat[node.lx][node.ly - 2][1])
{
Node tNode(node.lx, (node.ly - 2), false, true, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx][node.ly - 2][1] = node.t + 1;
} //lie horizontal right
if(TestLie(node.lx, (node.ly + 1), true, r, c)
&&
node.t + 1 < visMat[node.lx][node.ly + 1][1])
{
Node tNode(node.lx, (node.ly + 1), false, true, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx][node.ly + 1][1] = node.t + 1;
} } else//lie
{
if(node.horizontal == true)
{
//lie horizontal towards up
if(TestLie((node.lx - 1 ), node.ly, true, r, c)
&&
node.t + 1 < visMat[node.lx-1][node.ly][1])
{
Node tNode((node.lx-1), node.ly, false, true, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx-1][node.ly][1] = node.t + 1;
} //lie horizontal towards down
if(TestLie((node.lx + 1 ), node.ly, true, r, c)
&&
node.t + 1 < visMat[node.lx+1][node.ly][1])
{
Node tNode((node.lx+1), node.ly, false, true, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx+1][node.ly][1] = node.t + 1;
} //stand towards left
if(TestStand(node.lx, (node.ly-1), r, c)
&&
node.t + 1 < visMat[node.lx][node.ly-1][0])
{
Node tNode(node.lx, (node.ly-1), true, false, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx][node.ly - 1][0] = node.t + 1;
} //stand towards right
if(TestStand(node.lx, (node.ly+2), r, c)
&&
node.t + 1 < visMat[node.lx][node.ly+2][0])
{
Node tNode(node.lx, (node.ly+2), true, false, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx][node.ly + 2][0] = node.t + 1;
}
} else//lie vertically at first
{ //lie vertically towards left
if(TestLie(node.lx, (node.ly-1), false, r, c)
&&
node.t + 1 < visMat[node.lx][node.ly-1][2])
{
Node tNode(node.lx, (node.ly-1), false, false, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx][node.ly-1][2] = node.t + 1;
} //lie vertically toward right
if(TestLie(node.lx, (node.ly+1), false, r, c)
&&
node.t + 1 < visMat[node.lx][node.ly+1][2])
{
Node tNode(node.lx, (node.ly+1), false, false, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx][node.ly+1][2] = node.t + 1;
} //stand towards up
if(TestStand( (node.lx-1), node.ly, r, c)
&&
node.t + 1 < visMat[node.lx-1][node.ly][0])
{
Node tNode((node.lx-1), node.ly, true, false, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx-1][node.ly][0] = node.t + 1;
} //stand towards down
if(TestStand((node.lx+2), node.ly, r, c)
&&
node.t + 1 < visMat[node.lx+2][node.ly][0])
{
Node tNode((node.lx+2), node.ly, true, false, (node.t+1));
nodeQueue.push(tNode); visMat[node.lx+2][node.ly][0] = node.t + 1;
} }
}
} return visNum;
} int main()
{
int r,c;
scanf("%d%d",&r,&c); while(r!=0 && c!=0)
{
int ex = 0,ey = 0;
Node sNode;
sNode.t = 0; //Initialize the map
for(int i=0;i<r;i++)
{
scanf("%s",map[i]);
} //for(int i=0;i<r;i++)
//{
// for(int j=0;j<c;j++)
// {
// cout<<map[i][j];
// }
// cout<<endl;
//}
//Find the start point and end point.
int flag = 0;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
if( (map[i][j] == 'X') && ((flag & 1) == 0) )
{
flag = flag | 1;
if( (j+1 < c) && (map[i][j+1] == 'X') )
{
sNode.horizontal =true;
sNode.stand = false;
sNode.lx = i;
sNode.ly = j;
visMat[i][j][1] = 0;
}
else if( (i+1<r) && (map[i+1][j] == 'X') )
{
sNode.horizontal =false;
sNode.stand = false;
sNode.lx = i;
sNode.ly = j;
visMat[i][j][2] = 0;
} else
{
sNode.stand = true;
sNode.lx = i;
sNode.ly = j;
visMat[i][j][0] = 0;
}
} else if(map[i][j] == 'O')
{
flag = flag | (1<<1);
ex = i;
ey = j;
}
} if(flag == 3)
break;
} ////Initialize the visit matrix
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
for(int k=0;k<3;k++)
{
visMat[i][j][k] = MAX;
}
//memset(visMat,MAX,sizeof(visMat)); int step = BFSearch(r, c, sNode, ex,ey);
if(step >= 0)
{
printf("%d\n",step);
}
else
{
printf("Impossible\n");
} scanf("%d%d",&r,&c);
}
}

POJ3322-经典的游戏搜索问题的更多相关文章

  1. 用原生javascript模拟经典FC游戏公路争霸

    #用原生javascript模拟经典FC游戏公路争霸 前几天看了园子里面的随笔 [原生javascript开发仿微信打飞机小游戏](http://www.cnblogs.com/Mr-Nobody/p ...

  2. 用Python设计一个经典小游戏

    这是关于Python的第9篇文章,介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习 ...

  3. 基于jQuery经典扫雷游戏源码

    分享一款基于jQuery经典扫雷游戏源码.这是一款网页版扫雷小游戏特效代码下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <center> <h1>j ...

  4. python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (二)

    Hey! 如果你还没有看这篇的上文的话,可以去稍稍瞅一眼,会帮助加速理解这一篇里面涉及到的递归结构哦!(上一篇点这里:<python实例:解决经典扑克牌游戏 -- 四张牌凑24点 (一)> ...

  5. JS练习实例--编写经典小游戏俄罗斯方块

    最近在学习JavaScript,想编一些实例练练手,之前编了个贪吃蛇,但是实现时没有注意使用面向对象的思想,实现起来也比较简单所以就不总结了,今天就总结下俄罗斯方块小游戏的思路和实现吧(需要下载代码也 ...

  6. NOIp 2011 mayan游戏 搜索

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  7. WinFom中经典小游戏(含源码)

    最近整理了若干经典的小游戏,无聊时可以打发时间.程序本身不大,练手非常不错,主要是GDI编程,主界面地址如下图所示 源码下载方式 1,关注微信公众号:小特工作室(也可直接扫描签名处二维码) 2,发送: ...

  8. BZOJ1299[LLH邀请赛]巧克力棒——Nim游戏+搜索

    题目描述 TBL和X用巧克力棒玩游戏.每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度.TBL先手两人轮流,无法操作的人输. 他们以最佳策略一共进行了10轮(每次一盒). ...

  9. NOIP Mayan游戏 - 搜索

    Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定的步数内消除所有 ...

随机推荐

  1. "NO 3D support is available from the host"

    https://forums.opensuse.org/showthread.php/494522-No-3d-Support-or-graphics-accelleration http://ask ...

  2. Visual C++编程命名规则

    一.程序风格:      1.严格采用阶梯层次组织程序代码:      各层次缩进的分格采用VC的缺省风格,即每层次缩进为4格,括号位于下一行.要求相匹配的大括号在同一列,对继行则要求再缩进4格.例如 ...

  3. openstack 使用cloud init 和 console-log, nbd或者libguestfs 获取VM中的硬件信息。

    以获取PCI的信息为例. 基本代码: pci.py import base64 import guestfs from functools import partial import os impor ...

  4. VRay 2.0 SP1 2.10.01 for 3ds max 9/2008/2009/2010/2011/2012 32/64位 顶渲简体中文版+英文版[中国室内设计论坛-室内人]

    VRay 2.0 SP1 2.10.01 for 3ds max 9/2008/2009/2010/2011/2012 32/64位 顶渲简体中文版+英文版[中国室内设计论坛-室内人] 对最新版本的V ...

  5. C#打印条码BarTender SDK打印之路和离开之路(web平凡之路)

    从来没想过自己会写一篇博客,鉴于这次从未知的探索到一个个难点的攻破再到顺利打印,很想记录这些点滴,让后人少走弯路. 下面走进正题. 需求:取数据库里的相应的字段数据,并生成条形码,可以批量.单条打印. ...

  6. hdu 5621 KK's Point(数学,推理题)

    题解: 在圆上点三个点时,除圆上三个交点外,圆内没有交点:在圆上点四个点时,除圆上四个交点外,圆内出现了一个交点,因此,在N个点中每四个点便可以在圆内产生一个交点,因此N个点在圆内形成的点的个数为CN ...

  7. C#编程打字指法练习

    很惊讶昨晚写的第一篇学习笔记竟然有个评论了,只是今天还是对基础知识提不起精神,还是先看那三本书了解一下程序开发的大概流程吧. 今天不知道怎么闲逛就找到了这个网站,说是专门用于编程练习的,用google ...

  8. meta 标签整理

    <!-- 声明文档 --> <meta charset='utf-8'> <!-- 指示IE以目前可用的最高模式显示内容 --> <meta http-equ ...

  9. 一点用JS写控制权限的心得

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. Photoshop CS6 基础知识

                                                                  Photoshop CS6  基础知识 新建  练习 宽度72, 像素厘米 ...