题目链接点击打开链接
这道题是一个简单的搜索题,,只是在状态转移的过程中,有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; }