B.大钉骑马走江湖
江湖是什么,对于在象棋界厮杀的大钉来说,江湖就是一个矩阵,他的目标,就是在江湖之中骑着马,从他的位置出发,走到终点。
当然,大钉的马也遵从中国象棋中的“马走日”的规则,而且在矩阵中,也会有一些障碍物,马不能跳到障碍物上;如果大钉的马面前有障碍物,即被“别马腿”,那么他将不能跳向有障碍物的左前和右前这两个方向。
请问最少需要多少步,大钉才能骑着马跳到终点。
输入格式:
有多组测试样例。
每组第一行输入两个数 nn 和 mm,代表矩阵的行数和列数,2 \leq n \leq m < 1002≤n≤m<100。
接下来输入 nn 行字符串,其中 's' 代表起点,'e' 代表终点,'.' 代表空地,'#' 代表障碍物。
输出格式:
对应每组输入,输出骑马跳到终点的最小步数,如果跳不到终点,输出 -1−1。
样例1
输入:
3 3 s.. ... ..e 3 3 s#. ... #.e
输出:
4 -1
bfs题目。注意要有vis数组。
/* *********************************************** Author :guanjun Created Time :2016/4/24 15:14:21 File Name :1.cpp ************************************************ */ #include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <iomanip> #include <list> #include <deque> #include <stack> #define ull unsigned long long #define ll long long #define mod 90001 #define INF 0x3f3f3f3f #define maxn 10010 #define cle(a) memset(a,0,sizeof(a)) const ull inf = 1LL << 61; const double eps=1e-5; using namespace std; priority_queue<int,vector<int>,greater<int> >pq; char mp[120][120]; int n,m; struct node{ int x,y,dis; }; int sx,sy,ex,ey; int dir[8][2]={ 1,2,1,-2,2,1,2,-1,-1,2,-1,-2,-2,1,-2,-1 }; int vis[120][120]; void bfs(){ cle(vis); queue<node>q; node u={sx,sy,0}; q.push(u); int mark=0; while(!q.empty()){ node u=q.front(); q.pop(); //cout<<u.x<<" "<<u.y<<endl; if(u.x==ex&&u.y==ey){ if(u.dis==0)break; cout<<u.dis<<endl; mark=1; break; } node v; for(int i=0;i<8;i++){ v.x=u.x+dir[i][0]; v.y=u.y+dir[i][1]; int nx=u.x+dir[i][0]/2; int ny=u.y+dir[i][1]/2; if(mp[nx][ny]=='#')continue; if(v.x<n&&v.x>=0&&v.y>=0&&v.y<m&&(mp[v.x][v.y]!='#')&&!vis[v.x][v.y]){ v.dis=u.dis+1; q.push(v); vis[v.x][v.y]=1; } } } if(mark==0){ cout<<-1<<endl; } } int main() { // #ifndef ONLINE_JUDGE // freopen("in.txt","r",stdin); // #endif //freopen("out.txt","w",stdout); while(cin>>n>>m){ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>mp[i][j]; if(mp[i][j]=='s'){ sx=i,sy=j; } else if(mp[i][j]=='e'){ ex=i;ey=j; } } } bfs(); } return 0; }
原文地址:http://www.cnblogs.com/pk28/
与有肝胆人共事,从无字句处读书。
欢迎关注公众号:
欢迎关注公众号: