2015年安徽省程序设计大赛题,梯田问题题解
来源:互联网 发布:悟空传 知乎 编辑:程序博客网 时间:2024/05/01 10:18
梯田
Time Limit: 2000 MSMemory Limit: 65536 KBTotal Submissions: 136Accepted: 38Description
Input
对于每组数据,第一行为四个整数n,m,p,q
之后是一个n*m的矩阵,矩阵中每个整数代表每块田地高度
1<=T<=100
1<=n,m<=100
1<=p<=q<=n*m
1<=梯田高度<=1000000
Output
每组输出占一行
Sample Input
3 3 3 6
1 2 3
4 5 6
7 8 9
4 4 5 6
1 2 2 1
2 1 1 2
2 1 1 2
1 2 2 1
Sample Output
-1
Hint
一、它自身的高度<=h
二、它相邻的四块田地中至少有一块被淹没
我们可以认为,海啸发动的时候,梯田的外面都处于被淹没状态。
这是我遇到的一条比较烦的dfs求联通快问题+二分法。。
一开始dfs除了问题,搞了半天发现,条件写的有问题,不应该递归遍历周围8块,而应该是上下左右4块
后来二分法也出了一点问题,好在现在都解决了。。
代码如下
:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<map>
#include<vector>
#include<iostream>
#include<set>
#include<cmath>
using namespace std;
int a[105][105];
int graph[105][105];
int countn=0;
void dfs(int x,int y,int m,int n,int h)
{
if(x<0||x>m||y<0||y>n) return;
if(graph[x][y]==-1||graph[x][y]>h) return;//如果已经被标记或者高于海浪,就返回
graph[x][y]=-1;//标记
countn++;//为被淹的数量,包括了边界
dfs(x-1,y,m,n,h);
dfs(x,y+1,m,n,h);
dfs(x,y-1,m,n,h);
dfs(x+1,y,m,n,h);
}
void qian()
{
for(int i=0;i<=104;i++)
for(int j=0;j<=104;j++)
graph[i][j]=a[i][j];
countn=0;//初始时将图还原成出状态也可以用memset
}
int main()
{
int t;
cin>>t;
while(t--)
{
int H;
int flag=0;//标记这样的H是否真的存在
memset(a,0,sizeof(a));
memset(graph,0,sizeof(graph));
int n,m,p,q;
cin>>n>>m>>p>>q;//n*m的矩阵 //至少淹掉p,之多q
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
int left=0;
int right=1000000;
int mid;
while(right-left>1)//二分法找值
{
qian();
mid=(left+right)/2;
dfs(0,0,n+1,m+1,mid);
int mmm=countn-2*m-2*n-4;//mmm为被淹的田块数目
if(mmm>q)
right=mid;
else
if(mmm<p)
left=mid;
else
{
right=mid;
flag=1;//如果存在出于(p,q)之间的结果,就说明,这样的高度H 是存在的,否则不存在
H=mid;//此时left为小于p的最后一个高度,那mid或者right就是大于等于p小于等于q的第一个值
}
}
if(!flag)//如果flag=0,则不存在
cout<<-1<<endl;
else//否则输出是被淹田块数目大于等于p小于等于q的第一个值
cout<<H<<endl;
}
return 0;
}
- 2015年安徽省程序设计大赛题,梯田问题题解
- 安徽省2016“京胜杯”程序设计大赛_D_梯田AGAIN
- 2017年“华信智原杯”安徽省大学生程序设计大赛C题刷票
- 安徽省2015年“京胜杯”大学生程序设计竞赛-数七问题
- 2016年安徽省程序设计竞赛 水题C,D,E 题解
- 安徽省2016“京胜杯”程序设计大赛_C_箭无虚发
- 安徽省2016“京胜杯”程序设计大赛_E_转啊转
- 安徽省2016“京胜杯”程序设计大赛_K_纸上谈兵
- 2015年百度之星程序设计大赛 - 初赛(1) 【题解】
- 2015年百度之星程序设计大赛 - 初赛(2)【题解】
- 2015年福州大学第12届程序设计大赛题解
- 湖南省2011年程序设计大赛题解
- 计信院程序设计大赛题解
- 安徽省2016“京胜杯”程序设计大赛_A_砝码称重
- 安徽省2016“京胜杯”程序设计大赛_B_阵前第一功
- 安徽省2016“京胜杯”程序设计大赛_F_吃在工大
- 安徽省2016“京胜杯”程序设计大赛_G_木条染色
- 安徽省2016“京胜杯”程序设计大赛_H_单身晚会
- 类型萃取
- 多目录工程的CmakeLists.txt编写(自动添加多目录下的文件)
- 数据库中间件-mycat快速入门
- C/C++中const的区别
- "equal()"与"=="区别
- 2015年安徽省程序设计大赛题,梯田问题题解
- C语言--通过结构体成员的地址获取结构体变量的地址
- socket链接的关闭close和shutdown的区别
- sublime3配置eslint
- openshift认证
- Showing Recent Errors Only clang: error: linker command failed with exit code 1 (use -v to see invo
- 图文详解MyEclipse中新建Maven webapp项目的步骤(很详细)
- windows计划任务注意事项
- UIWebView与iOS端交互