马的遍历

题目描述

有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步

输入输出格式

输入格式:

一行四个数据,棋盘的大小和马的坐标

输出格式:

一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1)

#include<iostream>
#include<cstdio>
using namespace std;
struct wz{
	int x,y,z,bnt;
}dl[160005];
int ltt[405][405];
int a,b,c,d,i,j,k,l,m,n,tzz;
int main()
{
	cin>>a>>b>>c>>d;
	dl[1].x=c;
	dl[1].y=d;
	ltt[c][d]=-1;
	tzz=1;
	for(i=1;i<=tzz;i++)
	{
		if(dl[i].x+2<=a&&dl[i].y+1<=b)
		{
			if(ltt[dl[i].x+2][dl[i].y+1]==0)
			{
				tzz++;
				dl[tzz].bnt=dl[i].bnt+1;
				ltt[dl[i].x+2][dl[i].y+1]=dl[tzz].bnt;
				dl[tzz].x=dl[i].x+2;
				dl[tzz].y=dl[i].y+1;
			}
		}
		if(dl[i].x+1<=a&&dl[i].y+2<=b)
		{
			if(ltt[dl[i].x+1][dl[i].y+2]==0)
			{
				tzz++;
				dl[tzz].bnt=dl[i].bnt+1;
				ltt[dl[i].x+1][dl[i].y+2]=dl[tzz].bnt;
				dl[tzz].x=dl[i].x+1;
				dl[tzz].y=dl[i].y+2;
			}
		}
		if(dl[i].x-2>0&&dl[i].y-1>0)
		{
			if(ltt[dl[i].x-2][dl[i].y-1]==0)
			{
				tzz++;
				dl[tzz].bnt=dl[i].bnt+1;
				ltt[dl[i].x-2][dl[i].y-1]=dl[tzz].bnt;
				dl[tzz].x=dl[i].x-2;
				dl[tzz].y=dl[i].y-1;
			}
		}
		if(dl[i].x-1>0&&dl[i].y-2>0)
		{
			if(ltt[dl[i].x-1][dl[i].y-2]==0)
			{
				tzz++;
				dl[tzz].bnt=dl[i].bnt+1;
				ltt[dl[i].x-1][dl[i].y-2]=dl[tzz].bnt;
				dl[tzz].x=dl[i].x-1;
				dl[tzz].y=dl[i].y-2;
			}
		}
		if(dl[i].x-1>0&&dl[i].y+2<=b)
		{
			if(ltt[dl[i].x-1][dl[i].y+2]==0)
			{
				tzz++;
				dl[tzz].bnt=dl[i].bnt+1;
				ltt[dl[i].x-1][dl[i].y+2]=dl[tzz].bnt;
				dl[tzz].x=dl[i].x-1;
				dl[tzz].y=dl[i].y+2;
			}
		}
		if(dl[i].x-2>0&&dl[i].y+1<=b)
		{
			if(ltt[dl[i].x-2][dl[i].y+1]==0)
			{
				tzz++;
				dl[tzz].bnt=dl[i].bnt+1;
				ltt[dl[i].x-2][dl[i].y+1]=dl[tzz].bnt;
				dl[tzz].x=dl[i].x-2;
				dl[tzz].y=dl[i].y+1;
			}
		}
		if(dl[i].x+1<=a&&dl[i].y-2>0)
		{
			if(ltt[dl[i].x+1][dl[i].y-2]==0)
			{
				tzz++;
				dl[tzz].bnt=dl[i].bnt+1;
				ltt[dl[i].x+1][dl[i].y-2]=dl[tzz].bnt;
				dl[tzz].x=dl[i].x+1;
				dl[tzz].y=dl[i].y-2;
			}
		}
		if(dl[i].x+2<=a&&dl[i].y-1>0)
		{
			if(ltt[dl[i].x+2][dl[i].y-1]==0)
			{
				tzz++;
				dl[tzz].bnt=dl[i].bnt+1;
				ltt[dl[i].x+2][dl[i].y-1]=dl[tzz].bnt;
				dl[tzz].x=dl[i].x+2;
				dl[tzz].y=dl[i].y-1;
			}
		}
	}
	for(m=1;m<=a;m++)
	{
		for(n=1;n<=b;n++)
		{
			if(m==c&&n==d)
			{
				ltt[m][n]=0;
				printf("%-5d",ltt[m][n]);
				continue;
			}
			if(ltt[m][n]==0)
			{
				ltt[m][n]=-1;
				printf("%-5d",ltt[m][n]);
				continue;
			}
			printf("%-5d",ltt[m][n]);
		}
		cout<<endl;
	}
}


转载于:https://www.cnblogs.com/ztz11/p/9190007.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值