迷宫问题,二维数组模拟迷宫;

// 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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞