社区讨论
60分 2 3 8 10点过不去 求助!
P1514[NOIP 2010 提高组] 引水入城参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mi7uuron
- 此快照首次捕获于
- 2025/11/21 03:59 4 个月前
- 此快照最后确认于
- 2025/11/21 03:59 4 个月前
#include
#include
#include
#include
#define MAXN 510
using namespace std;
int n,m;
int h[MAXN][MAXN];//高度
int fi[MAXN],numi=0;
int la[MAXN],numa=0;
//离散化
//bool fit[MAXN][MAXN],lat[MAXN][MAXN];
//标记
bool vis[MAXN][MAXN];//访问标记
int fx[]={-1,0,1, 0};
int fy[]={ 0,1,0,-1};
int ss=0;
inline bool dfs1(int x,int y) {
if(x == n) ss++;
if(ss == m) return true;
for(int i=0;i<4;i++) {
int nx=x+fx[i],ny=y+fy[i];
if(nx<1 || nx>n || ny<1 || ny>m) continue;
if(h[nx][ny]>=h[x][y]) continue;
if(vis[nx][ny]) continue;
vis[nx][ny]=1;
if( dfs1(nx,ny) ) return true;
}
return false;
} //填充而非回溯
struct Seg {
int l,r;
bool operator < (const Seg& rhs) const {
if(this->l == rhs.l) return this->r > rhs.r;
return this->l < rhs.l;
}
};
Seg s[MAXN];
int nums=0;
int ll=m+1,rr=0;
inline void dfs2(int x,int y) {
if(x == n) {
ll=min(ll,y); rr=max(rr,y);
}
for(int i=0;i<4;i++) {
int nx=x+fx[i],ny=y+fy[i];
if(nx<1 || nx>n || ny<1 || ny>m) continue;
if(h[nx][ny]>=h[x][y]) continue;
if(vis[nx][ny]) continue;
vis[nx][ny]=1;
dfs2(nx,ny);
vis[nx][ny]=0;
}
}
int ans=0;
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) scanf("%d",&h[i][j]);
for(int i=1;i<=m;i++) {
if(h[1][i-1] <= h[1][i] && h[1][i] >= h[1][i+1]) fi[++numi]=i;
if(h[n][i-1] <= h[n][i] && h[1][i] >= h[1][i+1]) la[++numa]=i;
}//记录波峰
CPPfor(int i=1;i<=numi;i++) {
if(vis[1][fi[i]]) continue;
vis[1][fi[i]]=true;
dfs1(1,fi[i]);
}//先看看能不能到
if(ss < m) {
printf("0\n%d",m-ss); return 0;
}//到不了就输出
for(int i=1;i<=numi;i++) {
memset(vis,0,sizeof(vis));
ll=m+1; rr=0;
vis[1][fi[i]]=1;
dfs2(1,fi[i]);
vis[1][fi[i]]=0;
if(ll==m+1 && rr==0) continue;
s[++nums].l=ll; s[nums].r=rr;
}
sort(s+1,s+1+nums);
int tail=s[1].r;//尾部的
ans++;
for(int i=2;i<=nums;i++) {
if(s[i].l>tail+1 || s[i].r<=tail) continue;
ans++; tail=s[i].r;
}
printf("1\n%d",ans);
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...