北京林业大学校赛-B题(大钉骑马走江湖)

题目链接点击打开链接


这道题是一个简单的搜索题,,只是在状态转移的过程中,有8个方向,,但是并不是任何情况下都能转移,,要满足马走日的规则!!当然,大钉的马也遵从中国象棋中的“马走日”的规则,而且在矩阵中,也会有一些障碍物,马不能跳到障碍物上;如果大钉的马面前有障碍物,即被“别马腿”,那么他将不能跳向有障碍物的左前和右前这两个方向!!!


上面题目的描叙,,左前和右前,,我开始的时候没考虑上面和下面,wa了一发,,,题目应该说清楚,,但是常规来说,,确实是上下左右四个方向都能阻挡马的下一步转移!!


#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <map>
#include <vector>
#include <cmath>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn = 155;
string s[maxn];
int n, m;
int d[maxn][maxn];
bool flag;
struct node
{
	int x, y;
	node() {}
	node(int x, int y) :x(x), y(y) {}
}node1[11111], st, en;
int ans;
int vis[maxn][maxn];
int dir[8][2] = { -1,-2,-1,2,1,-2,1,2,-2,-1,-2,1,2,-1,2,1 };
void bfs()
{
	memset(vis, 0, sizeof(vis));
	memset(d, -0x3f, sizeof(d));
	queue<node>qq;
	d[st.x][st.y] = 0;
	vis[st.x][st.y] = 1;
	qq.push(st);

	while (!qq.empty())
	{
		node temp = qq.front();
		qq.pop();
		if (temp.x == en.x&&temp.y == en.y)
		{
			flag = true;
			ans = d[temp.x][temp.y];
			break;
		}
		int i, j;
		for (i = 0; i<8; i++)
		{
			int xx = temp.x + dir[i][0];
			int yy = temp.y + dir[i][1];
			if (i == 0||i==2)                                //左边有障碍物,不能走
			{
				if (temp.y - 1 >= 0 && temp.y - 1<m&&s[temp.x][temp.y - 1] == '#')
					continue;
			}
			if (i == 1||i==3)                                //右边有障碍物,不能走
			{
				if (temp.y + 1 >= 0 && temp.y + 1<m&&s[temp.x][temp.y + 1] == '#')
					continue;
			}
			if (i == 4 || i == 5)                            //当前状态上边有障碍物,不能走
			{
				if (temp.x - 1 >= 0 && temp.x - 1 < n&&s[temp.x - 1][temp.y] == '#')
					continue;
			}
			if (i == 6 || i == 7)                             //当前状态下边有障碍物,不能走
			{
				if (temp.x + 1 >= 0 && temp.x + 1 < n&&s[temp.x + 1][temp.y] == '#')
					continue;
			}
			if (xx >= 0 && xx<n&&yy >= 0 && yy<m&&s[xx][yy] != '#'&&!vis[xx][yy])
			{
				node tmp = node(xx, yy);
				d[tmp.x][tmp.y] = d[temp.x][temp.y] + 1;
				vis[xx][yy] = 1;
				qq.push(tmp);
			}
		}
	}
}
int main(void)
{
	//freopen("in.txt", "r", stdin);
	while (scanf("%d%d", &n, &m) != EOF)
	{
		int i, j;
		for (i = 0; i<n; i++)
		{
			cin >> s[i];
			for (j = 0; j<s[i].length(); j++)
			{
				if (s[i][j] == 's')
					st = node(i, j);
				if (s[i][j] == 'e')
					en = node(i, j);
			}
		}
		flag = false;
		bfs();
		if (flag)
			printf("%d\n", ans);
		else
			printf("-1\n");
	}
	return 0;
}


你可能感兴趣的:(北京林业大学校赛)