/* 比较简单的一道题,只要细心,思路清楚,基本都可以一遍过的 先把在地图上的实物数量化,墙是2,路是1,出界、河、铁墙都是-1 表示不能走。 然后用宽度遍历,起始点为队头,每次遍历上下左右四个方向 如果地图为-1,就不操作 如过地图不为-1,但没有遍历过,那么这块地图的步数应该是 队头地图的步数加上这块地图需要的步数。 如过地图不为-1,遍历过,那么这块地图的步数应该是 队头地图的步数加上这块地图需要的步数,和原来这块地图的 步数相比,最小的步数。 */ #include<iostream> #include<string.h> using namespace std; int n,m; int map[300+10][300+10]; int result[300+10][300+10]; int queue[100000]; int base,top; int fang[4][2]={0,1,0,-1,1,0,-1,0}; int main() { // freopen("in.txt","r",stdin); int i,j,x,y,x1,y1,resx,resy; char c; while(cin>>n>>m,n) { top=base=0; memset(map,-1,sizeof(map)); memset(result,-1,sizeof(result)); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cin>>c; if(c=='Y') { map[i][j]=0; result[i][j]=0; queue[top++]=i*1000+j;//起始坐标入队 } else if(c=='B')map[i][j]=2; else if(c=='E')map[i][j]=1; else if(c=='T')resx=i,resy=j,map[i][j]=1;//标记要求的坐标 } while(base!=top) { for(i=0;i<4;i++) { x=queue[base]/1000; x1=x+fang[i][0]; y=queue[base]%1000; y1=y+fang[i][1];//算出横纵坐标 if(map[x1][y1]==-1)continue;//如果在地图上走不成就继续 if(result[x1][y1]==-1||(result[x1][y1]>result[x][y]+map[x1][y1])) {//如果没有走过或者走过但不是最优,就更新为最优,继续入队 result[x1][y1]=result[x][y]+map[x1][y1]; queue[top++]=x1*1000+y1; } } base++;//判断完一个出队一个 } if(result[resx][resy]==-1)cout<<"-1\n"; else cout<<result[resx][resy]<<endl; } return(0); }
/* 也可以用优先队列来做,速度应该会快一点; 每次找最短的路走,走一个,就把这一个路 标记一下,下一次就不用走这条路. 其他的和上一个方法差不多 */ #include<iostream> #include<string.h> #include<queue> using namespace std; char map[300+2][300+2]; char fang[4][2]={0,1,0,-1,1,0,-1,0}; struct node { short x,y; int date; }a,b; bool operator<(const node &a,const node &b)//重载运算符 { return(a.date>b.date); } priority_queue<node>q; int n,m; int main() { // freopen("in.txt","r",stdin); int i,j,x,y,f; char c; while(cin>>n>>m,n) { memset(map,-1,sizeof(map)); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cin>>c; if(c=='Y') { map[i][j]=-1; a.x=i;a.y=j;a.date=0;q.push(a); } else if(c=='B')map[i][j]=2; else if(c=='E')map[i][j]=1; else if(c=='T')map[i][j]=1,x=i,y=j; } while(!q.empty()) { a=q.top(); q.pop(); f=0; for(i=0;i<4;i++) { b.x=a.x+fang[i][0]; b.y=a.y+fang[i][1]; if(map[b.x][b.y]==-1)continue; b.date=a.date+map[b.x][b.y]; map[b.x][b.y]=-1;//标记为不能走 if(b.x==x&&b.y==y){f=1;break;}//找到就退出 q.push(b); } if(f)break; } if(f)cout<<b.date<<endl;//输出 else cout<<"-1\n"; while(!q.empty())q.pop();//清空队列 } return(0); }
相关推荐
南阳理工oj离线题库
南阳理工学院OJ第1版解题报告V1.0.pdf
南阳理工学院OJ_个人AC代码包(Java提交) 是Java初学者登堂入室的很好例子。
南阳理工学院stl练习场全部ac代码!
南阳理工ACM离线题库
哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案哈理工OJ1084答案
西安理工大学学生在线实验系统编程题答案(超级详细)
基于Laravel 5.0的OJ题解网站 , 目前涵盖安科OJ,南阳OJ,杭电OJ ,北大OJ,浙大OJ.zip
山东理工大学2016级OJ进程,始于悦行,终于诚信。
(1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj...
趣味题:柱状图排序 西安理工大学学生在线实验系统 oj
DFS:depth first search深度优先搜索(迷宫寻路) BFS:breadth first search宽度优先搜索(迷宫最短路径) OJ习题答案
已知二叉树的中序和先序遍历可以唯一确定后序遍历、已知中序和后序遍历可以唯一确定先序遍历,但已知先序和后序,却不一定能唯一确定中序遍历。现要求根据输入的中序遍历结果及先序遍历结果,要求输出其后序遍历结果...
湖南理工学院OJ的0-100题解.rar
在线OJ网址大全在线OJ网址大全在线OJ网址大全在线OJ网址大全
厦门理工学院软件工程重点课件,考试前抱佛脚可用。
山东理工大学2016级OJ题目1833
山东理工大学2016级OJ题目1834
实在写不出来,这个可以提供一些思路,慎重《copy》
搭建OJ平台的工具,方便大家搭建自己的OJ,建议大家使用ubuntu14.04版本,比较稳定