大钉骑马走江湖 北京林业大学校赛。
来源:互联网 发布:股票价值分析软件 编辑:程序博客网 时间:2024/05/17 02:28
江湖是什么,对于在象棋界厮杀的大钉来说,江湖就是一个矩阵,他的目标,就是在江湖之中骑着马,从他的位置出发,走到终点。
当然,大钉的马也遵从中国象棋中的“马走日”的规则,而且在矩阵中,也会有一些障碍物,马不能跳到障碍物上;如果大钉的马面前有障碍物,即被“别马腿”,那么他将不能跳向有障碍物的左前和右前这两个方向。
请问最少需要多少步,大钉才能骑着马跳到终点。
输入格式:
有多组测试样例。
每组第一行输入两个数 n 和 m,代表矩阵的行数和列数,2≤n≤m<100。
接下来输入 n 行字符串,其中 's' 代表起点,'e' 代表终点,'.' 代表空地,'#' 代表障碍物。
输出格式:
对应每组输入,输出骑马跳到终点的最小步数,如果跳不到终点,输出 −1。
样例1
输入:
3 3s.......e3 3s#....#.e
输出:
4-1
bfs
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;char map1[110][110];int vis[110][110];int dir[8][2]= {{2,1},{-2,1},{2,-1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};int s1,e1,s2,e2;int n,m;struct node{ int x,y; int step;};void run(int x,int y){ if(map1[x+1][y]=='#') { if(x+2<n &&y+1<m) vis[x+2][y+1]=1; if(x+2<n &&y-1>=0) vis[x+2][y-1]=1; } if(map1[x-1][y]=='#') { if(x-2>=0 &&y+1<m) vis[x-2][y+1]=1; if(x-2>=0 &&y-1>=0) vis[x-2][y-1]=1; } if(map1[x][y-1]=='#') { if(x+1<n &&y-2>=0) vis[x+1][y-2]=1; if(x-1>=0 &&y-2>=0) vis[x-1][y-2]=1; } if(map1[x][y+1]=='#') { if(x+1<n &&y+2<m) vis[x+1][y+2]=1; if(x-1>=0 &&y+2<m) vis[x-1][y+2]=1; }}void run1(int x,int y){ if(map1[x+1][y]=='#') { if(x+2<n &&y+1<m) vis[x+2][y+1]=0; if(x+2<n &&y-1>=0) vis[x+2][y-1]=0; } if(map1[x-1][y]=='#') { if(x-2>=0 &&y+1<m) vis[x-2][y+1]=0; if(x-2>=0 &&y-1>=0) vis[x-2][y-1]=0; } if(map1[x][y-1]=='#') { if(x+1<n &&y-2>=0) vis[x+1][y-2]=0; if(x-1>=0 &&y-2>=0) vis[x-1][y-2]=0; } if(map1[x][y+1]=='#') { if(x+1<n &&y+2<m) vis[x+1][y+2]=0; if(x-1>=0 &&y+2<m) vis[x-1][y+2]=0; }}int bfs(int x,int y){ queue<node>q; node st,ed; st.x=x; st.y=y; st.step=0; q.push(st); while(!q.empty()) { st=q.front(); run(st.x,st.y); q.pop(); if(st.x==s2 &&st.y==e2) return st.step; for(int i=0; i<8; i++) { ed.x=st.x+dir[i][0]; ed.y=st.y+dir[i][1]; if(ed.x>=0 &&ed.x<n &&ed.y>=0 &&ed.y<m &&vis[ed.x][ed.y]==0 ) { ed.step=st.step+1; vis[ed.x][ed.y]=1; q.push(ed); } } run1(st.x,st.y); } return -1;}int main(){ while(cin>>n>>m) { int i,j; memset(vis,0,sizeof(vis)); for(i=0; i<n; i++) { cin>>map1[i]; for(j=0; j<m; j++) if(map1[i][j]=='s') { s1=i; e1=j; } else if(map1[i][j]=='e') { s2=i; e2=j; } else if(map1[i][j]=='#') vis[i][j]=1; } int ans=bfs(s1,e1); cout<<ans<<endl; } return 0;}
0 0
- 大钉骑马走江湖 北京林业大学校赛。
- 大钉骑马走江湖
- 大钉骑马走江湖
- 大钉骑马走江湖
- 大钉骑马走江湖【bfs】
- 计蒜客-大钉骑马走江湖
- 计蒜客 11064 大钉骑马走江湖
- 大钉骑马走江湖 (计蒜客)
- C++ - 计蒜客 - 大钉骑马走江湖(bfs)
- 大钉骑马走江湖 (bfs)
- 计蒜客————大钉骑马走江湖
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 B. 大钉骑马走江湖 (广搜)
- 北京林业大学 “计蒜客”杯程序设计竞赛 网络赛 B. 大钉骑马走江湖 BFS
- BFS — 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 —— 大钉骑马走江湖
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 常见问题——大钉骑马走江湖
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛-B大钉骑马走江湖
- 北京林业大学“计蒜客”杯程序设计竞赛 网络赛 B-大钉骑马走江湖【bfs】
- 第二届北京林业大学“计蒜客”杯程序设计竞赛 B题 大钉骑马走江湖
- 设计模式——桥接模式
- Mac系统如何编辑hosts文件
- Bitmap的加载和Cache————读书笔记
- A*算法入门
- Android系统的音量控制
- 大钉骑马走江湖 北京林业大学校赛。
- Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM:
- 第一次使用Android Studio 2.1需要知道的配置
- PHPExcel在linux环境下导出报500错误
- 面向对象——运算符重载
- Pseudo测试
- 查看特定进程杀死进程方法
- 快速排序
- Python一日一练19----统计字符串中的字符个数