# 马的遍历

题目描述

有一个 �×�n×m 的棋盘,在某个点 (�,�)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

输入格式

输入只有一行四个整数,分别为 �,�,�,�n,m,x,y。

输出格式

一个 �×�n×m 的矩阵,代表马到达某个点最少要走几步(不能到达则输出 −1−1)。

输入输出样例

输入 #1复制

3 3 1 1

输出 #1复制

0    3    2    
3    -1   1    
2    1    4    

代码:

#include<stdio.h>
int a[401][401]={0},b[401][401]={0},n,m,t,sx,x[100000],y[100000],d[100000]={0},e;
int dy[]={-2,-2,-1,1,2, 2, 1,-1};//马的八个走向 
int dx[]={-1, 1, 2,2,1,-1,-2,-2};
void kk(int i,int j)
{int tx,ty;
x[1]=i;y[1]=j;e=2;//队列的头建立 
for(int k=1;k<e;k++)//k的后面不一定就是e 
	for(sx=0;sx<8;sx++)
	{tx=x[k]+dx[sx];
	 ty=y[k]+dy[sx];
	
		if(tx>0&&tx<=n&&ty>0&&ty<=m&&a[tx][ty]==0)
		{a[tx][ty]=1;//确保不重复走 
		x[e]=tx;
		y[e]=ty;
		d[e]=d[k]+1;//k下标是e下标上一个位置 
		e++;	
		}
		
	}
	for(int k=1;k<e;k++)b[x[k]][y[k]]=d[k];//给数组赋值 

}
main()
{
	int i=0,j,x,y;
	scanf("%d %d %d %d",&n,&m,&x,&y);
	b[x][y]=0;//开始一定要赋值 
	a[x][y]=1;
	kk(x,y);
	for(i=1;i<=n;i++)
	{
		
	for(j=1;j<=m;j++)
	{
		
	if(a[i][j]==0)
	printf("%-5d",-1);
	else 	printf("%-5d",b[i][j]);
		
	}printf("\n");
}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值