C bfs 最少步数 来自小学生的奇思妙想T-T

版权声明:虽然我依旧蒟蒻,但请你尊重我 :D   ——陈杉菜 https://blog.csdn.net/qq_44702847/article/details/88875728


kail

题目描述

在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100*100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一个走黑马,一个走白马。谁用最少的步数走到左上角坐标为(1,1)的点时,谁获胜。现在他请你帮忙,给你A、B两点的坐标,想知道两个位置到(1,1)点可能的最少步数。

输入

共两行,每行两个整数,

第一行A点的位置,第二行为B点的位置

输出

为两行,第一行为A点到(1,1)的最少步数,第二行为B点到(1,1)的最小步数

样例输入

12 16
18 10

样例输出

8
9

如题,这是一道有小学生奇思妙想出来的题目啊啊啊啊
刚开始我以为是,有规律的,嗯,信心满满的wa了2次
然后,嗯,又wa了2次
然后我去网上找题解啊
居然还是wa
嗯, 显示运行错误
想不通 为什么
为什么 想不通
然后我就拷了网上大佬们的代码交上去
过 了。。。。。。。
后来我不知怎么的一想! 数组放错了!!!改完交上去,绿了啊哈哈哈,开心
我还是喜欢马走日象走田 ,嗯,毕竟无规矩无方圆
其实就是我太菜T-T

贴代码贴代码

#include<bits/stdc++.h>
#include <iostream>
#include<string>
#include<cmath>
typedef long long ll;
using namespace std;

int dx[12]= {-2,-2,-1,1,2,2,2,2,1,-1,-2,-2},
    dy[12]= {-1,-2,-2,-2,-2,-1,1,2,2,2,2,1}; 
int s[105][105],que[10000][4]= {0};
int main()
{
	int x1,x2,y1,y2;
	memset(s,0xff,sizeof(s));//初始化数组-1
	int head=0;
	int tail=1;
	int x,y;
	que[1][1]=1;//横坐标
	que[1][2]=1;//纵坐标
	que[1][3]=0;//(1,1)的最少步数是0
	
	cin>>x1>>y1>>x2>>y2;
	while(head<+tail){
		head++;
		for(int k=0;k<=11;k++){
			x=que[head][1]+dx[k];
			y=que[head][2]+dy[k];
			if(x>0 && y>0){
				if(s[x][y]==-1){
					tail++;
					s[x][y]=que[head][3]+1;//到(x,y)的最少步数
					que[tail][1]=x;
					que[tail][2]=y;
					que[tail][3]=s[x][y];
					if(s[x1][y1]>0 && s[x2][y2]>0)//只用走一遍,直接输出
					{
						cout<<s[x1][y1]<<endl;
						cout<<s[x2][y2]<<endl;
						return 0;
					}
				}
			}
		}
	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44702847/article/details/88875728
今日推荐