nyoj 547 优先队列
来源:互联网 发布:淘宝模板大寸好吗 编辑:程序博客网 时间:2024/05/18 03:05
#include<stdio.h>
#include<string.h>
#include<queue>//水杯盛水问题,用优先队列不断从最小的边缘开始
using namespace std;
int n,m;
#define N 400
int p[N][N];
struct node {
int x,y,w;
friend bool operator<(node a,node b) {//优先队列
return a.w>b.w;//从小到大出队
}
};
int visit[N][N];
int dis[4][2]={1,0,0,1,-1,0,0,-1};//四个方向
int judge(int x,int y) {
if(x<=n&&x>=1&&y<=m&&y>=1&&!visit[x][y])
return 1;
return 0;
}
int main() {
int i,j,sum;
while(scanf("%d%d",&m,&n)!=EOF) {
priority_queue<node>q;
node cur,next;
memset(visit,0,sizeof(visit));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++) {
scanf("%d",&p[i][j]);
if(j==1||j==m||i==1||i==n) {//先将杯子的边缘加入
cur.x=i;cur.y=j;
cur.w=p[i][j];
visit[i][j]=1;//标记边缘不能搜索
q.push(cur);
}
}
sum=0;
while(!q.empty()) {//每次从最小的边缘开始
cur=q.top();
q.pop();
for(i=0;i<4;i++) {
int xx=next.x=cur.x+dis[i][0];
int yy=next.y=cur.y+dis[i][1];
if(judge(xx,yy)) {//判断
visit[xx][yy]=1;
if(p[xx][yy]<cur.w) {//如果当前的边缘大于水杯内部
sum+=cur.w-p[xx][yy];//高度差即为所能盛的水
next.w=cur.w;//改变当前点值
q.push(next);
}
else {//
next.w=p[xx][yy];/
q.push(next);//
}
}
}
}
printf("%d\n",sum);//
}
return 0;
}
#include<string.h>
#include<queue>//水杯盛水问题,用优先队列不断从最小的边缘开始
using namespace std;
int n,m;
#define N 400
int p[N][N];
struct node {
int x,y,w;
friend bool operator<(node a,node b) {//优先队列
return a.w>b.w;//从小到大出队
}
};
int visit[N][N];
int dis[4][2]={1,0,0,1,-1,0,0,-1};//四个方向
int judge(int x,int y) {
if(x<=n&&x>=1&&y<=m&&y>=1&&!visit[x][y])
return 1;
return 0;
}
int main() {
int i,j,sum;
while(scanf("%d%d",&m,&n)!=EOF) {
priority_queue<node>q;
node cur,next;
memset(visit,0,sizeof(visit));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++) {
scanf("%d",&p[i][j]);
if(j==1||j==m||i==1||i==n) {//先将杯子的边缘加入
cur.x=i;cur.y=j;
cur.w=p[i][j];
visit[i][j]=1;//标记边缘不能搜索
q.push(cur);
}
}
sum=0;
while(!q.empty()) {//每次从最小的边缘开始
cur=q.top();
q.pop();
for(i=0;i<4;i++) {
int xx=next.x=cur.x+dis[i][0];
int yy=next.y=cur.y+dis[i][1];
if(judge(xx,yy)) {//判断
visit[xx][yy]=1;
if(p[xx][yy]<cur.w) {//如果当前的边缘大于水杯内部
sum+=cur.w-p[xx][yy];//高度差即为所能盛的水
next.w=cur.w;//改变当前点值
q.push(next);
}
else {//
next.w=p[xx][yy];/
q.push(next);//
}
}
}
}
printf("%d\n",sum);//
}
return 0;
}
0 0
- nyoj 547 优先队列
- NYOJ 635优先队列
- 【NYOJ 284 BFS+优先队列】
- nyoj 55(优先队列)
- NYOJ 284 优先队列 搜索
- NYOJ 284 坦克大战【优先队列】
- NYOJ 284 坦克大战 【BFS】+【优先队列】
- NYOJ 1100 广搜优先队列
- nyoj 21 三个水杯 【BFS + 优先队列】
- NYOJ 284 坦克大战 【BFS】+【优先队列】
- nyoj 757 期末考试【优先队列】【快排】
- NYOJ 757 期末考试(优先队列)
- nyoj 757 期末考试 【STL 优先队列】
- NYOJ 754 黑心医生(优先队列)
- NYOJ 284--坦克大战【BFS && 优先队列】
- nyoj--284 坦克大战(bfs+优先队列)
- NYOJ-284坦克大战(优先队列)
- NYOJ 55 懒省事的小明 【优先队列】
- 调用系统相机拍照,裁剪图片
- mysql数据库无法连接(JDBC)java.net.ConnectException: Connection timed out
- 如何使用 DevExpress MVVM 架构构建具有 DOCK 能力的 MVVM 程序?
- 相对路径 VS 绝对路径
- mysql算两个日期之间的工作日
- nyoj 547 优先队列
- Excel函数大全
- NYOJ 117 求逆序数
- [openstack]卸载卷(detach volume)流程
- 聚类算法推荐:一种元学习的方法
- 网页自动播放声音
- dos下查看端口
- CPU的cache基础知识
- 在C++ MFC中Single document和Dialog based有什么具体的区别?