c++10oop实现迷宫(未完)

1.思路

/*
用OOP完成迷宫路径的寻找问题,软件运行要求如下:
请输入迷宫的行列数: 5 5
请输入迷宫路径节点信息(1表示不能走,0表示能走)
0 0 1 0 1
0 0 1 0 0
1 0 0 1 0
0 1 0 0 0
开始寻找迷宫路径(从左上角到右下角的一个可通行的路径):
迷宫不存在可通行的路径
。。 1 0 1
0 。1 0 0
1 。。 1 0
0 1 。。。

const int WAY_CNT = 4;   // 总的方向数目
const int WAY_RIGHT = 0;
const int WAY_DOWN = 1;
const int WAY_LEFT = 2;
const int WAY_UP = 3;
const int CSEQTACKSIZE=5;//eqtack
const int WAY_STATE_OK = 5; // 路径方向可以行走
const int WAY_STATE_ERR = 6;  // 路径方向不能行走

class MazeNode  // 迷宫节点类型
{
public :
	//MazeNode(int v=10,int x=1,int y=2,int s=3 );
	void setval(int val){_val=val;}
	void setX(int x){_x=x;}
	void setY(int y){_y=y;}
	/*void setWaystate(int way, int state)
	{
		_state[way] = state; 
	}*/
	int getval(){return _val;}
	int getX(){return _x;}
	int getY(){return _y;}
	void changeWaystate(int direction,int state )
	{
		_state[direction]=state;
	}
	int getstate(int direction){return _state[direction];}

private:
	int _val;
	int _x;
	int _y;
	int _state[WAY_CNT];
};
class CSeqtack  // 栈类型
{
public:
	CSeqtack(int size=10)
	{
		_top=0;
		_size=size;
		_stack=new MazeNode[_size*_size];
	}
	bool full(){return _top==_size;}
	bool empty(){return _top ==0;}
	void push(const MazeNode &node)//入栈
	{
		if(full())
		{
			MazeNode*ptmp=new MazeNode[(_size +1)*(_size +1)];//扩容
			for(int i=0;i<_size ;i++)
			{
				ptmp [i]=_stack [i];
			}
			delete []_stack ;
			_stack =ptmp ;
			_size =(_size +1)*(_size +1);
		}
		_stack [_top++]=node ;
	}
	void pop()//出栈
	{
		if(empty())
		{
			cout<<"栈空了"<<endl;
		}
		--_top;
	}
	MazeNode top()
	{
		return _stack [_top-1];
	}

private:
	MazeNode *_stack;
	int _top;
	int _size;
	CSeqtack(const CSeqtack&);
	CSeqtack& operator=(const CSeqtack&);
};
class Maze  // 迷宫类型
{
public:
	Maze(int r = 10, int c = 10):_row(r),_col (c)
	{
		_pMazes =new MazeNode *[_row ];
		for(int i=0;i<_row;i++)
		{
			_pMazes[i] =new MazeNode [_col ];
		}
	}
	void initMazeNode(int x,int y,int val)//初始化节点信息
	{
		_pMazes[x][y].setX(x);
		_pMazes[x][y].setY(y);
		_pMazes[x][y].setval(val);
		for (int i = 0; i < WAY_CNT; ++i)
		{
			_pMazes[x][y].changeWaystate(i, WAY_STATE_OK);
		}
	}
	//int getval(){return _pMazes}
	void adjustMazeNode()
	{
		for(int i=0;i<_row;++i)
		{
			for(int j=0;j<_col;++j)
			{
				if (_pMazes[i][j].getval() == 1)
					continue;
				if(i==0)//上边不能走
				{
					_pMazes [i][j].changeWaystate (WAY_UP,WAY_STATE_ERR);
				}
				if(j==0)//左边不能走
				{
					_pMazes [i][j].changeWaystate (WAY_LEFT ,WAY_STATE_ERR);
				}
				if(i==_row-1)//下面不能走
				{
					_pMazes [i][j].changeWaystate (WAY_DOWN,WAY_STATE_ERR);
				}
				if(j==_col-1)//右边不能走
				{
					_pMazes [i][j].changeWaystate (WAY_RIGHT,WAY_STATE_ERR);
				}
				if(j<_col-1&&_pMazes [i][j+1].getval() ==1)//看右边是不是1  [i][j+1]  j<col
				{
					_pMazes [i][j+1].changeWaystate (WAY_RIGHT,WAY_STATE_ERR);
				}
				if(i>0&&_pMazes[i-1][j].getval()==1)//看上边是不是为1  [i-1][j]  i>0
				{
					_pMazes[i-1][j].changeWaystate (WAY_UP ,WAY_STATE_ERR);
				}
				if(j>0&&_pMazes[i][j-1].getval()==1)//看左边是不是为1 [i][j-1]   j>0
				{
					_pMazes[i][j-1].changeWaystate (WAY_LEFT  ,WAY_STATE_ERR);
				}
				if(i<_row-1 &&_pMazes[i+1][j].getval()==1)//看下面是不是为1[i+1][j]   i<row
				{
					_pMazes[i+1][j].changeWaystate (WAY_DOWN,WAY_STATE_ERR);
				}
			}
		}
	}
	void findMazePath()//寻找路径
	{
		if (_pMazes[0][0].getval() == 1)
		{
			return;
		}
		_stack.push(_pMazes[0][0]);
 		
		while(!_stack .empty ())
		{
			MazeNode node = _stack.top();
			int i = node.getX();
			int j = node.getY();

			//MazeNode top=_stack .top();
			
			/*int x = node.getX();
			int y = node.getY();
			if (x == _row - 1 && y == _col - 1)
			{
				return;
			}*/
			if (i == _row - 1 && j == _col - 1)
			{
				return;
			}
					
					if(/*j>0&&*/node.getstate (WAY_LEFT)==WAY_STATE_OK)//左边可以走
					{
						
						_pMazes[i][j].changeWaystate (WAY_LEFT ,WAY_STATE_ERR);
						//_pMazes[i][j].setval ('*');
						_pMazes[i][j-1].changeWaystate (WAY_RIGHT ,WAY_STATE_ERR);
						_stack .push (_pMazes[i][j-1]);
						continue;
						//j=j-1;
					}
					if(/*i<_col&&*/node.getstate(WAY_DOWN)==WAY_STATE_OK)//下边可以走)
					{
						
						//_pMazes[i][j].setval ('*');
						_pMazes[i][j].changeWaystate (WAY_DOWN  ,WAY_STATE_ERR);
						_pMazes[i+1][j].changeWaystate (WAY_UP ,WAY_STATE_ERR);
						_stack .push (_pMazes[i+1][j]);
						continue;
						//i+=1;
					}
					if(/*j<_col-1&&*/node.getstate (WAY_RIGHT)==WAY_STATE_OK)//右边可以走	
					{
						
						_pMazes[i][j].changeWaystate(WAY_RIGHT ,WAY_STATE_ERR);//我的右边不能走
						_pMazes[i][j+1].changeWaystate(WAY_LEFT ,WAY_STATE_ERR);
						//_pMazes[i][j].setval('*');
						_stack.push(_pMazes[i][j+1]);//往右走
						continue;
						
					}
					if(/*i>0&&*/node.getstate(WAY_UP)==WAY_STATE_OK)//上边可以走
					{
						
						//_pMazes[i][j].setval ('*');
						_pMazes[i][j].changeWaystate (WAY_UP  ,WAY_STATE_ERR);
						_pMazes[i-1][j].changeWaystate (WAY_DOWN ,WAY_STATE_ERR);
						continue;
						_stack .push (_pMazes[i-1][j]);
						//i-=1;
					}
					else
					{
						continue;
					}
				
			//_stack.pop();
		}
	}
	void showMazePath()
	{
		if(_stack .empty ())
		{
			cout<<"迷宫不存在可通行的路径"<<endl;
			return;
		}
		while (!_stack.empty())
		{
			MazeNode top = _stack.top();
			_pMazes[top.getX()][top.getY()].setval('*');
			_stack.pop();
		}
		for (int i = 0; i < _row; ++i)
		{
			for (int j = 0; j < _col; ++j)
			{
				if (_pMazes[i][j].getval() == '*')
				{
					cout << "*" << " ";
				}
				else
				{
					cout << _pMazes[i][j].getval() << " ";
				}
			}
			cout<<endl;
		}
	}
private:
	int _row;
	int _col;
	MazeNode **_pMazes;
	CSeqtack _stack;
};
int main()
{
	cout << "请输入迷宫的行列数:";
	int row, col;
	cin >> row >> col;

	Maze maze(row, col);

	cout << "请输入迷宫路径节点信息(1表示不能走,0表示能走):" << endl;
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)
		{
			int data;
			cin >> data;
			// data i, j
			maze.initMazeNode(i, j,data);
		}
	}
	// 调整迷宫节点方向的行走状态
	maze.adjustMazeNode();
	//maze.showMazePath();
	//cout<<endl;
	// 开始寻找迷宫路径
	maze.findMazePath();
	//maze.showMazePath();
	//cout<<endl;
	// 打印迷宫寻找的结果
	maze.showMazePath();
	return 0;
}

迷宫数组
0 0 1 0 1
0 0 1 0 0
1 0 0 1 0
0 1 0 0 0

0 0 1 0 1
0 0 1 0 0
1 0 0 1 0
0 1 0 0 0
右下左上0123

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值