江湖是什么,对于在象棋界厮杀的大钉来说,江湖就是一个矩阵,他的目标,就是在江湖之中骑着马,从他的位置出发,走到终点。
当然,大钉的马也遵从中国象棋中的“马走日”的规则,而且在矩阵中,也会有一些障碍物,马不能跳到障碍物上;如果大钉的马面前有障碍物,即被“别马腿”,那么他将不能跳向有障碍物的左前和右前这两个方向。
请问最少需要多少步,大钉才能骑着马跳到终点。
输入格式:
有多组测试样例。
每组第一行输入两个数 nn 和 mm,代表矩阵的行数和列数,2 \leq n \leq m < 1002≤n≤m<100。
接下来输入 nn 行字符串,其中 's' 代表起点,'e' 代表终点,'.' 代表空地,'#' 代表障碍物。
输出格式:
对应每组输入,输出骑马跳到终点的最小步数,如果跳不到终点,输出 -1−1。
输入:
3 3 s.. ... ..e 3 3 s#. ... #.e
输出:
4 -1
解题思路:
简单搜索。
#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; int n,m; char map[500][500]; int vis[500][500]; int dx[8]={1, -1, 1, -1, 2, -2, 2, -2}; int dy[8]={2, 2, -2, -2, 1, 1, -1, -1}; int sx,sy; struct node { int x,y,time; }; int bfs(int x,int y) { int i; queue<node >q; node k,s; k.x=x; k.y=y; k.time=0; vis[x][y]=1; q.push(k); while(!q.empty()) { k=q.front(); q.pop(); if(map[k.x][k.y]=='e') { return k.time; } for(i=0;i<4;i++) { s=k; s.x=k.x+dx[i]; s.y=k.y+dy[i]; s.time+=1; if(s.x>=0&&s.y>=0&&s.x<n&&s.y<m&&!vis[s.x][s.y]&&map[s.x][s.y]!='#'&&map[s.x-dx[i]][s.y-dy[i]/2]!='#') { q.push(s); vis[s.x][s.y]=1; } } for(i=4;i<8;i++) { s=k; s.x=k.x+dx[i]; s.y=k.y+dy[i]; s.time+=1; if(s.x>=0&&s.y>=0&&s.x<n&&s.y<m&&!vis[s.x][s.y]&&map[s.x][s.y]!='#'&&map[s.x-dx[i]/2][s.y-dy[i]]!='#') { q.push(s); vis[s.x][s.y]=1; } } } return -1; } int main() { while(scanf("%d%d",&n,&m)!=EOF) { int i,j; for(i=0;i<n;i++) { scanf("%s",map[i]); for(j=0;j<m;j++) { if(map[i][j]=='s') { sx=i,sy=j; } } } memset(vis,0,sizeof(vis)); printf("%d\n",bfs(sx,sy)); } return 0; }