标签:二维数组 i++ display 返回 orm node -- 本地 ping
一个整数,为最少拆毁的障碍物数量,如果不能逃离废墟,输出-1。
3 3 3 ### #@* *** 3 4 #### #@.* **.* 3 3 .#. #@# .#.
1 0 -1
题目大意:中文就没什么好说了,提一下猪被救的条件。猪如果可以移动到给出图形边缘位置,那么它就获救。求需要拆除的废墟的最少数量。
大致思路:简单的BFS,猪从起点开始,每次走的时候遍历四个方向,一直到边缘位置即可。定义一个结构体节点,用优先队列来保存节点。优先级队列如果插入的节点是结构体类型,则要在结构体中重载比较操作符函数。当时做的时候还在想,怎么判断拆的废墟是最少的,写的时候发现BFS借助队列本来就是可以找最少量的。。。详见代码。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include <queue> #define maxn 105 using namespace std; int n,m; int mark[maxn][maxn]; char ma[maxn][maxn]; int dX[4]={0,0,-1,1};//四个方向,也可以开二维数组存 int dY[4]={-1,1,0,0}; struct Node { int x,y,step; friend bool operator <(Node a,Node b)//可以当模板记住 { return a.step>b.step; } }; void bfs(int x,int y) { int step; priority_queue<Node> q; Node p1; p1.x=x; p1.y=y; p1.step=0; memset(mark,0,sizeof(mark)); mark[p1.x][p1.y]=1; q.push(p1); while(!q.empty()) { p1=q.top(); q.pop(); x=p1.x; y=p1.y; step=p1.step; if(x==0||y==0||x==n-1||y==m-1) { cout<<step<<endl; return; } Node p2; for(int i=0;i<4;i++) { p2.x=x+dX[i]; p2.y=y+dY[i]; p2.step=0; if(p2.x>=0&&p2.y>=0&&p2.x<n&&p2.y<m) { if(ma[p2.x][p2.y]==‘*‘) p2.step=step+1; else if(ma[p2.x][p2.y]==‘.‘) p2.step=step; else p2.step=-1; if(p2.step>=0&&mark[p2.x][p2.y]==0)//注意前一个判断条件,防止不可拆除的废墟被算在内 { mark[p2.x][p2.y]=1; q.push(p2); } } } } cout<<-1<<endl;//如果没走出,记得返回-1 } int main() { int T,sx,sy; scanf("%d",&T); while(T--) { scanf("%d%d", &n, &m); for (int i=0; i<n; ++i) scanf("%s", ma+i);//字符串的输入,用指针的形式 for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if (ma[i][j] == ‘@‘)//找出起点 { sx = i; sy = j; } } bfs(sx,sy); } return 0; }
标签:二维数组 i++ display 返回 orm node -- 本地 ping
原文地址:http://www.cnblogs.com/FTA-Macro/p/7266592.html