标签:
7 8 #.#####. #.a#..r. #..#x... ..#..#.# #...##.. .#...... ........
13
解题思路:
简单的优先队列题目。复习一下优先队列用法.
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <cmath>
#include <iomanip>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <cctype>
using namespace std;
const int maxn=202;
char mp[maxn][maxn];
bool vis[maxn][maxn];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
int sx,sy,ex,ey;
int n,m;
struct Node
{
int x,y;
int step;
};
int step[maxn][maxn];
bool operator<(Node a,Node b)
{
return a.step>b.step;
}
bool ok(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m&&mp[x][y]!='#')
return true;
return false;
}
void BFS(int x,int y)
{
step[x][y]=0;
memset(vis,0,sizeof(vis));
vis[x][y]=1;
priority_queue<Node>q;
Node tp;
tp.x=x,tp.y=y,tp.step=0;
q.push(tp);
while(!q.empty())
{
Node first=q.top();
if(first.x==ex&&first.y==ey)
break;
q.pop();
for(int i=0;i<4;i++)
{
int nextx=first.x+dx[i];
int nexty=first.y+dy[i];
if(!vis[nextx][nexty]&&ok(nextx,nexty))
{
vis[nextx][nexty]=1;
tp.x=nextx;
tp.y=nexty;
if(mp[nextx][nexty]=='x')
{
step[nextx][nexty]=first.step+2;
tp.step=first.step+2;
}
else
{
step[nextx][nexty]=first.step+1;
tp.step=first.step+1;
}
q.push(tp);
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
if(mp[i][j]=='r')
sx=i,sy=j;
else if(mp[i][j]=='a')
ex=i,ey=j;
}
BFS(sx,sy);
if(!vis[ex][ey])
printf("Poor ANGEL has to stay in the prison all his life.\n");
else
printf("%d\n",step[ex][ey]);
}
return 0;
}
优先队列用法:
///优先队列是默认int从大到小priority_queue<int>q1,也可以定义为从小到大priority_queue<int,vector<int>,greater<int> >q2;
也可以自定义优先级,重载<
#include <iostream>
#include <functional>
#include <queue>
using namespace std;
///自定义优先级,两种写法,按照优先级从大到小的顺序
/*
struct node
{
friend bool operator<(node n1,node n2)
{
return n1.priority<n2.priority;
}
int priority;
int value;
};*/
struct node
{
int priority;
int value;
};
bool operator<(node a,node b)
{
return a.priority<b.priority;
}
int main()
{
const int len=5;
int i;
int a[len]={3,5,9,6,2};
//优先队列中从大到小输出
priority_queue<int>q1;
for(i=0;i<len;i++)
q1.push(a[i]);
for(int i=0;i<len;i++)
{
cout<<q1.top();
q1.pop();
}
cout<<endl;
//优先队列中从小到大输出
/**
priority_queue<int,vector<int>,greater<int> >q2;
for(i=0;i<len;i++)
q2.push(a[i]);
for(i=0;i<len;i++)
{
cout<<q2.top();
q2.pop();
}*/
priority_queue<int,vector<int>,greater<int> >q;
for(int i=0;i<len;i++)
q.push(a[i]);
while(!q.empty())
{
cout<<q.top();
q.pop();
}
cout<<endl;
//按照某个优先级输出,该代码中为priority值大的先输出
priority_queue<node>q3;
node b[len];
b[0].priority=6;b[0].value=1;
b[1].priority=9;b[1].value=5;
b[2].priority=2;b[2].value=3;
b[3].priority=8;b[3].value=2;
b[4].priority=1;b[4].value=4;
for(i=0;i<len;i++)
q3.push(b[i]);
cout<<"优先级"<<'\t'<<"值"<<endl;
for(i=0;i<len;i++)
{
cout<<q3.top().priority<<'\t'<<q3.top().value<<endl;
q3.pop();
}
return 0;
}
运行:
96532
23569
优先级 值
9 5
8 2
6 1
2 3
1 4
标签:
原文地址:http://blog.csdn.net/sr_19930829/article/details/42706469