课程设计之马的遍历

#include<iostream>
#include<algorithm>
#include<stack>
#include<iomanip>
using namespace std;
#define MAXN 10050
int maze[MAXN][MAXN];
int n,m;
 
struct point 
{
	int x;
	int y;
	int step;
};

void init()
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			maze[i][j]=-1;
		}
	}
}

bool jud(int x,int y)//判断点是否在棋盘内以及是否被走过 
{
	if(x<0||x>=n||y<0||y>=m||maze[x][y]!=-1) return 0;
	return 1;
}

stack<point> s;//栈中含有点的三个信息用来储存顺序 
 
int step;//记录路径顺序 

point u;//栈顶元素 
int dir[8][2]={{1, -2}, { 2, -1}, {2, 1 }, { 1, 2 }, {-1, 2}, {-2, 1 },{-2, -1},{-1, -2} }; //方向数组,控制马走的八个方向 

int flag;

void dfs(int nx,int ny)//深度优先搜索 
{
	if(step>n*m) //一旦步数超过搜索终止 
	{
		flag=1;
		return ;
	}
	u=s.top();
	maze[u.x][u.y]=step++;
	for(int i=0;i<8;i++)
	{
		point d;
		d.x=nx+dir[i][0];
		d.y=ny+dir[i][1];
		if(jud(d.x,d.y))//判断该点是否满足条件 
		{
			s.push(d);//满足条件则入栈 
			dfs(d.x,d.y);//递归下去 
		}
	}
}

int main()
{
	point start;
	while(1)
	{
		flag=1; 
		step=1;
		while(!s.empty())
		{
			s.pop();
		}
		cout<<"输入棋盘的长和宽"<<endl;
		cin>>n>>m;
		cout<<"输入马的出发点 "<<endl;
		cin>>start.x>>start.y;
		int flag=1;
		init();
		if(start.x<0||start.x>=8||start.y<0||start.y>=8) 
		{
			cout<<"坐标错误"<<endl;
		}
		maze[start.x][start.y]=1;
		s.push(start);	
		dfs(start.x,start.y);
		for(int i=0;i<n;i++)//判断是否有 
		{
			for(int j=0;j<m;j++)
			{
				if(maze[i][j]==-1) 
				{
					flag=0;
					break;
				}
			}
		}
		if(!flag) cout<<"无法走通"<<endl;
		else
		{
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<m;j++)
				{
					cout<<setw(3)<<maze[i][j]<<" ";
				}
				cout<<endl;
			}
			int t=0;
			cout<<"遍历的顺序为:"<<endl;
			while(!s.empty())
			{
				u=s.top();
				cout<<"第"<<t++<<"步"<<"("<<u.x<<","<<u.y<<")"<<endl;
				s.pop();
			}	
		} 
	}
	return 0;
 } 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值