一道迷宫题目的非递归解法
2010-12-31 13:07
204 查看
最近,一直在忙着复习,也没多时间,编程,只能抽出一点时间了(悲剧,哎,在中国当学生就是累,明明教育水平,和理念都很落后,可学校还要培养出,什么都会得全才。)好了不多说了,题目如下:
有一个长方形的房间里,是用方瓦覆盖的。每个方瓦的颜色是红色或黑色。一名男子正站在一个黑色瓷砖。他从他所站的方瓦上,可以转移到相邻的四个砖之一。但他无法进入红瓦,他只可以进入黑瓦。
编写一个程序来计算黑瓦数量,也就是他可以达到的方瓦数(重复上述动作)。
输入包含多个数据集。一个数据集的包含有在开始的第一行的两个正整数W和H,W和H表示x和y方向上的方瓦数。 W和H的不超过20。之后有H行的数据集,其中每行包括W列字符。每个字符代表着瓷砖的颜色如下:
‘.’ ——黑色的瓷砖
‘#’——红色的瓷砖
‘@’——黑砖上的男子
该程序可以循环输入,当输入的W和H都为0时,程序终止。
我采用一个结构体来模拟迷宫。用广度搜索来确定可已走的结点 代码如下:
#include<iostream>
#include<deque>
using namespace std;
struct Node{
char data;//砖的颜色
int H;//节点横坐标
int L;//节点纵坐标
int v;//节点访问系数
};
void main(){
int m,n;//输入迷宫的维数 m 表深度 n 表宽度
cout<<"enter your array's information about length and width:"<<endl;
cin>>m>>n;
Node**p=new Node*[m];//动态二维指针
for(int i=0;i<m;i++)
p[i]=new Node
;
deque<Node*>Q;//定义一个结构体指针型的双端队列
for(i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>p[i][j].data;//黑色 or 红色
if(p[i][j].data=='@'){//如果是人的初始指针那么进入队列
Q.push_front(*(p+i)+j);
p[i][j].data='B';
}
p[i][j].H=i;//初始化迷宫数组
p[i][j].L=j;
p[i][j].v=0;
}
}
Node*q=Q.front();
q->v=1;//修改人的初始位置的访问参数
int count=1;//计数变量
while(!Q.empty()){// 根据图的广度搜索遍历原理,先对当前结点的同一层可到达的结点进行访问,然后对下一层,上一层开始访问。
Node*k=Q.front();//用一个工作指针 来得到队列的“头元素”
Q.pop_front();//出队,删除头元素
int a=k->H;//当前元素的横坐标
int b=k->L;//当前元素的纵坐标
while(b>-1){//想左找可行结点
b--;
if(b>-1&&p[a][b].data=='B'&&p[a][b].v==0){//能走通且没走过 入队尾,并计数
Q.push_back(*(p+a)+b);
p[a][b].v=1;
count++;
}
else break;//走不通,或已经走过,则退出。
}
b=k->L;
while(b<n){//向右找可行的结点
b++;
if(b<n&&p[a][b].data=='B'&&p[a][b].v==0){
Q.push_back(*(p+a)+b);
p[a][b].v=1;
count++;
}
else break;
}
b=k->L;
if(a+1<m&&p[a+1][b].data=='B'&&p[a+1][b].v==0){//向上一层找可行结点
p[a+1][b].v=1;
count++;
Q.push_back(*(p+a+1)+b);
}
if(a-1>-1&&p[a-1][b].data=='B'&&p[a-1][b].v==0){//向下一层找可行结点
count++;
Q.push_back(*(p+a-1)+b);
p[a-1][b].v=1;
}
}//搜索结束,count记录下所有可以到达的结点总数
cout<<"you can getthrougth:"<<count;//输出可走结点个数
}
有一个长方形的房间里,是用方瓦覆盖的。每个方瓦的颜色是红色或黑色。一名男子正站在一个黑色瓷砖。他从他所站的方瓦上,可以转移到相邻的四个砖之一。但他无法进入红瓦,他只可以进入黑瓦。
编写一个程序来计算黑瓦数量,也就是他可以达到的方瓦数(重复上述动作)。
输入包含多个数据集。一个数据集的包含有在开始的第一行的两个正整数W和H,W和H表示x和y方向上的方瓦数。 W和H的不超过20。之后有H行的数据集,其中每行包括W列字符。每个字符代表着瓷砖的颜色如下:
‘.’ ——黑色的瓷砖
‘#’——红色的瓷砖
‘@’——黑砖上的男子
该程序可以循环输入,当输入的W和H都为0时,程序终止。
我采用一个结构体来模拟迷宫。用广度搜索来确定可已走的结点 代码如下:
#include<iostream>
#include<deque>
using namespace std;
struct Node{
char data;//砖的颜色
int H;//节点横坐标
int L;//节点纵坐标
int v;//节点访问系数
};
void main(){
int m,n;//输入迷宫的维数 m 表深度 n 表宽度
cout<<"enter your array's information about length and width:"<<endl;
cin>>m>>n;
Node**p=new Node*[m];//动态二维指针
for(int i=0;i<m;i++)
p[i]=new Node
;
deque<Node*>Q;//定义一个结构体指针型的双端队列
for(i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>p[i][j].data;//黑色 or 红色
if(p[i][j].data=='@'){//如果是人的初始指针那么进入队列
Q.push_front(*(p+i)+j);
p[i][j].data='B';
}
p[i][j].H=i;//初始化迷宫数组
p[i][j].L=j;
p[i][j].v=0;
}
}
Node*q=Q.front();
q->v=1;//修改人的初始位置的访问参数
int count=1;//计数变量
while(!Q.empty()){// 根据图的广度搜索遍历原理,先对当前结点的同一层可到达的结点进行访问,然后对下一层,上一层开始访问。
Node*k=Q.front();//用一个工作指针 来得到队列的“头元素”
Q.pop_front();//出队,删除头元素
int a=k->H;//当前元素的横坐标
int b=k->L;//当前元素的纵坐标
while(b>-1){//想左找可行结点
b--;
if(b>-1&&p[a][b].data=='B'&&p[a][b].v==0){//能走通且没走过 入队尾,并计数
Q.push_back(*(p+a)+b);
p[a][b].v=1;
count++;
}
else break;//走不通,或已经走过,则退出。
}
b=k->L;
while(b<n){//向右找可行的结点
b++;
if(b<n&&p[a][b].data=='B'&&p[a][b].v==0){
Q.push_back(*(p+a)+b);
p[a][b].v=1;
count++;
}
else break;
}
b=k->L;
if(a+1<m&&p[a+1][b].data=='B'&&p[a+1][b].v==0){//向上一层找可行结点
p[a+1][b].v=1;
count++;
Q.push_back(*(p+a+1)+b);
}
if(a-1>-1&&p[a-1][b].data=='B'&&p[a-1][b].v==0){//向下一层找可行结点
count++;
Q.push_back(*(p+a-1)+b);
p[a-1][b].v=1;
}
}//搜索结束,count记录下所有可以到达的结点总数
cout<<"you can getthrougth:"<<count;//输出可走结点个数
}
相关文章推荐
- 题目1335:闯迷宫 BFS实现 和 递归实现。
- 一道经典的额递归题目
- 迷宫的另一种解法[非递归]
- 转:算法合集之《从一道题目的解法试谈网络流的构造与算法》
- 一道递归思想的排列组合题目
- 数据结构 迷宫 C++源代码 非递归解法
- 一道题目,学到了递归while实现和“<<”运算级
- 一道面试题目解法
- 初探“递归”——由一道题目引出的问题
- 一道算法题目的解法
- 迷宫 DFS 递归 解法
- PAT上面一道关于“月饼”的题目的解法
- 迷宫 DFS 递归 解法
- csdn 一道“高难”题目的解法
- 一道递归题目
- 数学与程序的结合——一道游戏题目的快速解法
- 一道爱出的题目,就是前面两个数相加 用递归方法实现
- 关于一道题目解法
- 栈的应用——迷宫的非递归解法
- 一道考递归的题目