// Datastructure2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
static int w;
static int h;
static int column = 0;
static int row = 0;
static int **A; //声明二级指针A,指向一个指针数组
//***************************************************************************
//顺序栈实现
//***************************************************************************
template<class T>
class ArrayStack
{
private:
int size;//栈的大小
int tos;//栈顶索引
T*contain;
public:
ArrayStack():size(0),tos(-1),contain(NULL){}
ArrayStack(int maxsize);
~ArrayStack();
void Push(const T&element);
T& GetTop();
T&Pop();
bool IsEmpty();
void MakeEmpty();
};
template<class T>
ArrayStack<T>::ArrayStack(int maxsize)
{
size=maxsize;
tos=-1;
contain=new T[maxsize];
}
template<class T>
ArrayStack<T>::~ArrayStack()
{
delete contain;
tos=-1;
size=0;
}
template<class T>
void ArrayStack<T>::Push(const T&element)
{
if(tos==size-1)
{
//cout<<"栈已经满"<<endl;
return;
}
else
{
tos++;
contain[tos]=element;
}
}
template<class T>
T& ArrayStack<T>::GetTop()
{
return contain[tos];
}
template<class T>
T& ArrayStack<T>::Pop()
{
if(tos==-1)
{
int i=0;
//cout<<"栈为空"<<endl;
return contain[tos--];
}
else
{
return contain[tos--];
}
}
template<class T>
bool ArrayStack<T>::IsEmpty()
{
if(tos==-1)
return true;
else
return false;
}
template<class T>
void ArrayStack<T>::MakeEmpty()
{
delete contain;
tos=-1;
size=0;
}
bool Right(int column,int row){
if (column + 1 < w) {
if (A[column + 1][row] == 0) {
return true;
} else {
return false;
}
} else {
return false;
}
}
bool Left(int column,int row){
if (column - 1 >= 0) {
if (A[column - 1][row] == 0) {
return true;
} else {
return false;
}
} else {
return false;
}
}
bool Down(int column,int row){
if (row + 1 < h) {
if (A[column][row + 1] == 0) {
return true;
} else {
return false;
}
} else {
return false;
}
}
bool Up(int column,int row){
if (row - 1 >= 0) {
if (A[column][row - 1] == 0) {
return true;
} else {
return false;
}
} else {
return false;
}
}
bool isPassway(){
ArrayStack<int>*point=new ArrayStack<int>(w*h);
point->Push(column * 100 + row * 10 + 0);
if (Right(column, row)) {
column = column + 1;
int data = column * 100 + row * 10 + 6;
point->Push(data);
} else {
if (Down(column, row)) {
row = row + 1;
point->Push(column * 100 + row * 10 + 2);
} else {
cout<<"此迷宫无通路!\n";
return false;
}
}
int count = 0;
while (!(column == (w - 1) && row == (h - 1))) {
int temp;
if(point->IsEmpty()){
cout<<"此迷宫无通路!\n";
return false;
}else{
temp = point->GetTop();
}
int turn = temp % 10;
if (turn == 6) {
if (Right(column, row)) {
column = column + 1;
point->Push(column * 100 + row * 10 + 6);
count++;
} else {
if (Down(column, row)) {
row = row + 1;
point->Push(column * 100 + row * 10 + 2);
count++;
} else {
if (Up(column, row)) {
row = row - 1;
point->Push(column * 100 + row * 10 + 8);
count++;
} else {
column = column - 1;
if(point->IsEmpty()){
cout<<"此迷宫无通路!\n";
return false;
}else{
point->Pop();
point->Pop();
point->Push(column * 100 + row * 10 + 4);
}
}
}
}
} else {
if (turn == 2) {
if (Right(column, row)) {
column = column + 1;
point->Push(column * 100 + row * 10 + 6);
count++;
} else {
if (Down(column, row)) {
row = row + 1;
point->Push(column * 100 + row * 10 + 2);
count++;
} else {
if (Left(column, row)) {
column = column - 1;
point->Push(column * 100 + row * 10 + 4);
count++;
} else {
row = row - 1;
if(point->IsEmpty()){
cout<<"此迷宫无通路!\n";
return false;
}else{
point->Pop();
point->Pop();
point->Push(column * 100 + row * 10 + 8);
}
}
}
}
} else {
if (turn == 4) {
if (Down(column, row)) {
row = row + 1;
point->Push(column * 100 + row * 10 + 2);
count++;
} else {
if (Left(column, row)) {
column = column - 1;
point->Push(column * 100 + row * 10 + 4);
count++;
} else {
if (Up(column, row)) {
row = row - 1;
point->Push(column * 100 + row * 10 + 8);
count++;
} else {
column = column + 1;
if(point->IsEmpty()){
cout<<"此迷宫无通路!\n";
return false;
}else{
point->Pop();
point->Pop();
point->Push(column * 100 + row * 10 + 6);
}
}
}
}
} else {
if (Right(column, row)) {
column = column + 1;
point->Push(column * 100 + row * 10 + 6);
count++;
} else {
if (Left(column, row)) {
column = column - 1;
point->Push(column * 100 + row * 10 + 4);
count++;
} else {
if (Up(column, row)) {
row = row - 1;
point->Push(column * 100 + row * 10 + 8);
count++;
} else {
row = row + 1;
if(point->IsEmpty()){
cout<<"此迷宫无通路!\n";
return false;
}else{
point->Pop();
point->Pop();
point->Push(column * 100 + row * 10 + 2);
}
}
}
}
}
}
}
if (count >= (w * h)) {
cout<<"此迷宫无通路!\n";
column = 0;
row = 0;
point->MakeEmpty();
return false;
}
}
column = 0;
row = 0;
point->MakeEmpty();
return true;
}
void Step(){
ArrayStack<int>*point=new ArrayStack<int>(w*h);
cout<<"此迷宫有通路!\n";
point->Push(column * 100 + row * 10 + 0);
if (Right(column, row)) {
column = column + 1;
point->Push(column * 100 + row * 10 + 6);
cout<<"(右)坐标:"<<column+1<<","<<row+1<<endl;;
} else {
if (Down(column, row)) {
row = row + 1;
point->Push(column * 100 + row * 10 + 2);
cout<<"(下)坐标:"<<column+1<<","<<row+1<<endl;;
} else {
cout<<"此迷宫无通路!\n";
}
}
while (!(column == (w - 1) && row == (h - 1))) {
int temp = point->Pop();
point->Push(temp);
int turn = temp % 10;
if (turn == 6) {
if (Right(column, row)) {
column = column + 1;
point->Push(column * 100 + row * 10 + 6);
cout<<"(右)坐标:"<<column+1<<","<<row+1<<endl;
} else {
if (Down(column, row)) {
row = row + 1;
point->Push(column * 100 + row * 10 + 2);
cout<<"(下)坐标:"<<column+1<<","<<row+1<<endl;
} else {
if (Up(column, row)) {
row = row - 1;
point->Push(column * 100 + row * 10 + 8);
cout<<"(上)坐标:"<<column+1<<","<<row+1<<endl;
} else {
column = column - 1;
point->Pop();
point->Pop();
point->Push(column * 100 + row * 10 + 4);
cout<<"(倒退)坐标:"<<column+1<<","<<row+1<<endl;
}
}
}
} else {
if (turn == 2) {
if (Right(column, row)) {
column = column + 1;
point->Push(column * 100 + row * 10 + 6);
cout<<"(右)坐标:"<<column+1<<","<<row+1<<endl;
} else {
if (Down(column, row)) {
row = row + 1;
point->Push(column * 100 + row * 10 + 2);
cout<<"(下)坐标:"<<column+1<<","<<row+1<<endl;
} else {
if (Left(column, row)) {
column = column - 1;
point->Push(column * 100 + row * 10 + 4);
cout<<"(左)坐标:"<<column+1<<","<<row+1<<endl;
} else {
row = row - 1;
point->Pop();
point->Pop();
point->Push(column * 100 + row * 10 + 8);
cout<<"(倒退)坐标:"<<column+1<<","
<<row+1<<endl;
}
}
}
} else {
if (turn == 4) {
if (Down(column, row)) {
row = row + 1;
point->Push(column * 100 + row * 10 + 2);
cout<<"(下)坐标:"<<column+1<<","<<row+1<<endl;
} else {
if (Left(column, row)) {
column = column - 1;
point->Push(column * 100 + row * 10 + 4);
cout<<"(左)坐标:"<<column+1<<","<<row+1<<endl;
} else {
if (Up(column, row)) {
row = row - 1;
point->Push(column * 100 + row * 10 + 8);
cout<<"(上)坐标:"<<column+1<<","<<row+1<<endl;
} else {
column = column + 1;
point->Pop();
point->Pop();
point->Push(column * 100 + row * 10 + 6);
cout<<"(倒退)坐标:"<<column+1<<","
<<row+1<<endl;
}
}
}
} else {
if (Right(column, row)) {
column = column + 1;
point->Push(column * 100 + row * 10 + 6);
cout<<"(右)坐标:"<<column+1<<","<<row+1<<endl;
} else {
if (Left(column, row)) {
column = column - 1;
point->Push(column * 100 + row * 10 + 4);
cout<<"(左)坐标:"<<column+1<<","<<row+1<<endl;
} else {
if (Up(column, row)) {
row = row - 1;
point->Push(column * 100 + row * 10 + 8);
cout<<"(上)坐标:"<<column+1<<","<<row+1<<endl;
} else {
row = row + 1;
point->Pop();
point->Pop();
point->Push(column * 100 + row * 10 + 2);
cout<<"(倒退)坐标:"<<column+1<<","
<<row+1<<endl;
}
}
}
}
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"请输入迷宫宽:\n";
cin>>w;
cout<<"请输入迷宫高:\n";
cin>>h;
A = new int *[w]; //开辟指针数组
for(int i=0; i<w; i++){A[i] = new int[h];}
cout<<"开始输入数据:\n";
for (int i = 0; i < h; i++) {
cout<<"请输入第:"<<(i + 1)<<"行数据.\n";
char input[10];
cin>>input;
for (int j = 0; j < w; j++) {
if(input[j]==48){
A[j][i]=0;
}else{
A[j][i]=1;
}
}
}
cout<<"*******迷宫建立完成*******\n";
cout<<"********迷宫模型********\n";
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cout<<"|"<<A[j][i];
}
cout<<"|\n";
}
cout<<"\n**********************\n";
if(isPassway()){
Step();
}
return 0;
}
迷宫问题,二维数组模拟迷宫;
原文作者:迷宫问题
原文地址: https://blog.csdn.net/q6475005/article/details/7876313
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/q6475005/article/details/7876313
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。