1. 程式人生 > >下象棋【BFS】

下象棋【BFS】

個數 LG for HA con abs push ron post

下象棋

發布時間: 2018年1月25日 20:25 最後更新: 2018年1月25日 20:26 時間限制: 1000ms 內存限制: 128M

江湖是什麽,對於在象棋界廝殺的QQ來說,江湖就是一個矩陣,他的目標,就是在江湖之中騎著馬,從他的位置出發,走到終點。

當然,QQ的馬也遵從中國象棋中的“馬走日”的規則,而且在矩陣中,也會有一些障礙物,馬不能跳到障礙物上;如果大釘的馬面前有障礙物,即被“別馬腿”,那麽他將不能跳向有障礙物的左前和右前這兩個方向。

請問最少需要多少步,大釘才能騎著馬跳到終點。

有多組測試樣例。

每組第一行有兩個數 n 和 m,代表矩陣的行數和列數,2 <= n <= m < 100。

接下來輸入 n 行的字符串,其中 ‘s‘ 代表起點,‘e‘ 代表終點,‘.‘代表空地,‘#‘代表障礙物。

對應每組輸入,輸出騎馬跳到終點的最小步數,如果跳不到終點,輸出 -1。

3 3
s..
...
..e

3 3
s#.
...
#.e
4
-1

#include <stdio.h>
#include <string.h>
#include 
<iostream> #include <queue> #include <algorithm> using namespace std; struct dian { int i; int j; int step; }; char map[110][110]; int vis[110][110]; int dir[8][2] = { { -2,1 },{ -1,2 },{ 1,2 },{ 2,1 },{ 2,-1 },{ 1,-2 },{ -1,-2 },{ -2,-1 } }; int main() { int n, m; queue
<dian>q; while (scanf("%d%d", &n, &m) != EOF) { dian now, next; bool tp = false; int i, j; for (i = 0; i < n; i++)scanf("%s", map[i]); memset(vis, 0, sizeof(vis)); while (!q.empty())q.pop(); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { if (map[i][j] == s) { now.i = i; now.j = j; now.step = 0; tp = true; break; } } if (tp==true)break; } int flag = 0; q.push(now); while (!q.empty()) { now = q.front(); q.pop(); if (map[now.i][now.j] == e) { flag = 1; break; } /*if (vis[now.i][now.j])continue;*/ vis[now.i][now.j] = 1; for (i = 0; i < 8; i++) { next.i = now.i + dir[i][0]; next.j = now.j + dir[i][1]; if (next.i<0 || next.i >= n || next.j<0 || next.j >= m) continue; if (vis[next.i][next.j]) continue; if (abs(dir[i][0]) == 2 && map[now.i + dir[i][0] / 2][now.j] == #) continue; if (abs(dir[i][1]) == 2 && map[now.i][now.j + dir[i][1] / 2] == #) continue; if (map[next.i][next.j] == . || map[next.i][next.j] == e) { next.step = now.step + 1; q.push(next); } } } flag ? printf("%d\n", now.step) : printf("-1\n"); } return 0; }

2018-03-31




下象棋【BFS】