深度优先搜索之中国象棋

题目描述:
中国象棋博大精深,其中马的规则最为复杂,也是最难操控的一颗棋子。

我们都知道象棋中马走"日",比如在 (2, 4)(2,4) 位置的一个马,跳一步能到达的位置有 (0, 3)(0,3),(0, 5)(0,5),(1, 2)(1,2),(1, 6)(1,6),(3, 2)(3,2),(3, 6)(3,6),(4, 3)(4,3),(4, 5)(4,5)。

在这里插入图片描述

蒜头君正在和花椰妹下棋,蒜头君正在进行战略布局,他需要把在 (x,y)(x,y) 位置的马跳到 (x’, y’)(x

,y

) 位置,以达到威慑的目的。

但是棋盘大小有限制,棋盘是一个 10 \times 910×9 的网格,左上角坐标为 (0, 0)(0,0),右下角坐标为 (9, 8)(9,8),马不能走出棋盘,并且有些地方已经有了棋子,马也不能跳到有棋子的点。

蒜头君想知道,在不移动其他棋子的情况下,能否完成他的战略目标。

输入格式
输入一共 1010 行,每行一个长度为 99 的字符串。

输入表示这个棋盘,我们用’.‘表示空位置,用’#'表示该位置有棋子,用’S’表示初始的马的位置,用’T’表示马需要跳到的位置。

输入保证一定只存在一个’S’和一个’T’。

输出格式
如果在不移动其他棋子的情况下,马能从’S’跳到’T’,那么输出一行"Yes",否则输出一行"No"。

样例输入 复制
.#…#S#
…#.#.#…
…##.#…#
…##.
…T…
…#.#…
…#…
…###…

.##…
样例输出 复制
Yes
代码描述:

#include<iostream>
#include<string>
using namespace std;
string map[10];
bool vis[10][9];
int n,m;
int step[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
bool in(int x,int y)
{
	return 0<=x&&x<10&&0<=y&&y<9;
}
bool dfs(int x,int y)
{
	if(map[x][y]=='T')
	{
		return true;
	}
	vis[x][y]=true;
	for(int i=0;i<8;i++)
	{
		int x2=x+step[i][0];
		int y2=y+step[i][1];
		if(in(x2,y2)&&map[x2][y2]!='#'&&!vis[x2][y2])
		{
			if(dfs(x2,y2))
			{
				return true;
			}
		}
	}
	//vis[x][y]=false;
	//map[x][y]='.';
	return false;
}
int main()
{
	for(int i=0;i<10;i++)
	{
		cin>>map[i];
	}
	int x,y;
	for(int i=0;i<10;i++)
	{
		for(int j=0;j<9;j++)
		{
			if(map[i][j]=='S')
			{
				x=i;
                y=j;
			}
		}
	}
	if(dfs(x,y))
	{
		cout<<"Yes"<<endl;
	}
	else
	{
		cout<<"No"<<endl;
	}
}

版权声明:本文为qq_35058075原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。