HDU1010 Tempter of the Bone

本文介绍了一个使用广度优先搜索(BFS)算法解决迷宫问题的C++实现案例。通过定义位置类和矩阵类,实现了从起点到终点的路径寻找,并考虑了时间限制条件。尽管尝试了多种测试案例,但仍未能通过所有测试。

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1010

古人云:“由简入奢易,由奢入简难”,咱写代码也是一样,不求最快,但求最繁,繁得让你都不忍读完它。。。。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --> #include < iostream >
#include
< vector >
#include
< queue >
using namespace std;

class postion
{//位置类
public:
postion(
intr=0,intc=0):row(r),col(r)
{
}

voidsetRow(intr)
{
row
=r;
}

voidsetCol(intc)
{
col
=c;
}

intgetRow()const
{
returnrow;
}

intgetCol()const
{
returncol;
}

postion
&operator=(constpostion&rhs)
{
row
=rhs.row;
col
=rhs.col;
level
=rhs.level;
return*this;
}

booloperator==(constpostion&rhs)const
{
if(row==rhs.row&&col==rhs.col)
returntrue;
else
returnfalse;
}

voidsetLevel(intlev)
{
level
=lev;
}

intgetLevel()const
{
returnlevel;
}

private:
introw;
intcol;
intlevel;//所处的层次
}
;

typedefqueue
< postion,deque < postion,allocator < postion > > > POSTION_QUEUE;

template
< typenameT >
class Matrix
{//矩阵类
public:
Matrix(
intnR=0,intnC=0,inttm=0)
{
nRows
=nR;
nCols
=nC;
timeout
=tm;
initMat();
//初始化矩阵
}

vector
<T>&operator[](intnR)
{//重载[]操作符
returndata[nR];
}

voidsetStartPos(intr,intc)
{//设置起始点
start.setRow(r);
start.setCol(c);
start.setLevel(
0);
}

voidsetExitPos(intr,intc)
{//设置出口点
exit.setRow(r);
exit.setCol(r);
}

boolisPosOK(constpostion&curPos,postion&desPos,inttype)
{
intcurRow=curPos.getRow();//当前行
intcurCol=curPos.getCol();//当前列

switch(type)
{
case0://东面
{
if(data[curRow][curCol+1]!='X'&&visited[curRow][curCol+1]==false)
{
desPos.setRow(curRow);
desPos.setCol(curCol
+1);
returntrue;
}

break;
}

case1://南面
{
if(data[curRow+1][curCol]!='X'&&visited[curRow+1][curCol]==false)
{
desPos.setRow(curRow
+1);
desPos.setCol(curCol);
returntrue;
}

break;
}

case2://西面
{
if(data[curRow][curCol-1]!='X'&&visited[curRow][curCol-1]==false)
{
desPos.setRow(curRow);
desPos.setCol(curCol
-1);
returntrue;
}

break;
}

case3://北面
{
if(data[curRow-1][curCol]!='X'&&visited[curRow-1][curCol]==false)
{
desPos.setRow(curRow
-1);
desPos.setCol(curCol);
returntrue;
}

break;
}

default:
break;
}

returnfalse;
}

voidescape()
{//BFS算法来从迷宫中逃出,不懂啥剪枝不剪枝。。。
POSTION_QUEUEqRoad;
start.setLevel(
0);//起始点在第0层
qRoad.push(start);
postioncurPos;
postiondesPos;
//下一个目标点
inti;
intcurLev=0;
while(!qRoad.empty())
{
curPos
=qRoad.front();
curLev
=curPos.getLevel();//获取当前所处层次
if(curPos==exit&&curLev<=timeout)
{//达到出口点了,ok,missionover
cout<<"YES"<<endl;
return;
}

introw=curPos.getRow();
intcol=curPos.getCol();
visited[row][col]
=true;//当前位置标记为已经访问过了

for(i=0;i<4;i++)
{
if(i==0&&col==nCols-1)continue;
elseif(i==1&&row==nRows-1)continue;
elseif(i==2&&col==0)continue;
elseif(i==3&&row==0)continue;
else
if(isPosOK(curPos,desPos,i))
{//下一个位置可用

desPos.setLevel(curLev
+1);
qRoad.push(desPos);
visited[desPos.getRow()][desPos.getCol()]
=true;
}


}

qRoad.pop();
}

cout
<<"NO"<<endl;
}


private:
vector
<vector<T>>data;//存储数据
vector<vector<bool>>visited;
intnRows;//行数
intnCols;//列数
inttimeout;//计时器
postionstart;//起始点
postionexit;//出口点
voidinitMat()
{//真正的初始化矩阵
inti,j;
for(i=0;i<nRows;++i)
{
data.push_back(vector
<T>());
visited.push_back(vector
<bool>());
for(j=0;j<nCols;++j)
{
data[i].push_back(T());
visited[i].push_back(
false);
}

}

}


}
;

int main()
{
intn,m,t,i,j;
while(cin>>n>>m>>t&&!(n==0&&m==0&&t==0))
{
chartmp;
Matrix
<char>maze(n,m,t);
for(i=0;i<n;++i)
for(j=0;j<m;++j)
{
cin
>>tmp;
maze[i][j]
=tmp;
switch(tmp)
{
case'S':
maze.setStartPos(i,j);
//设置起始点
break;
case'D':
maze.setExitPos(i,j);
//设置出口点
break;
}

}

maze.escape();

}

return0;
}
本地测试结果

可惜还是WA,不过实在是想不出来还有什么特别的测试用例没试过了,从起始点开始广度优先搜索,每进下一级子层都记录下所在层次数,在前进的过程中若达到出口,且层次数和时限吻合就成功,思路应该是没错的,看他们都是用的DFS,难道不能用BFS?算了,先记录在此,以后再修改。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值