栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

K11544 最少步数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

K11544 最少步数

题目描述

在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。

小科就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试。

在一个(100×100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。

现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。

输入格式

两行

第一行,两个整数,代表A的坐标

第二行,两个整数,代表B的坐标

输出格式

两行

第一行,A点到(1,1)点可能的最少步数

第二行,B点到(1,1)点可能的最少步数

输入输出样列

输入样例1:                                                            输出样例1:

12 16                                        8
18 10                                        9

AC代码:

#include
using namespace std;
const int N=105,dlt[12][2]={{-2,-2},{-2,-1},{-2,1},{-2,2},{-1,2},{1,2},{2,2},{2,1},{2,-1},{2,-2},{1,-2},{-1,-2}};
struct Vex{
	int x,y;
}a,b,dst;
int dis[N][N];
inline bool judge(Vex v){
	return v.x>=1&&v.x<=100&&v.y>=1&&v.y<=100;
}
void bfs(Vex u){
	dis[u.x][u.y]=1;
	queue  q;
	q.push(u);
	while(!q.empty()){
		if(dis[a.x][a.y]&&dis[b.x][b.y]) return;
		u=q.front(); q.pop();
		for(int k=0;k<12;k++){
			Vex v;
			v.x=u.x+dlt[k][0],v.y=u.y+dlt[k][1];
			if(judge(v)&&!dis[v.x][v.y]){
				dis[v.x][v.y]=dis[u.x][u.y]+1;
				q.push(v);
			} 
		}
	}
}
int main(){
	cin>>a.x>>a.y>>b.x>>b.y;
	dst.x=dst.y=1;
	bfs(dst);
	cout< 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311871.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号