1. 程式人生 > >P1514 引水入城

P1514 引水入城

cpp cst struct == end i++ for string -1


#include<iostream> #include<cstring> #include<algorithm> using namespace std; struct def1 { int x; int y; } q[3000000]; struct def2 { int len; int x; int y; } val[550]; int dctx[6]= {0,1,0,-1,0},dcty[6]= {0,0,1,0,-1}; int n,m,h=0,t=0,cnt=0,height[550][550]; bool vis[550][550]; bool cmp(def2 a,def2 b) { if(a.x==0)return false; if(b.x==0)return true; if(a.x!=b.x)return a.x<b.x; else return a.y>b.y; } void bfs() { memset(vis,0,sizeof(vis)); for(int i=1; i<=m; i++) { t++; q[t].x=1;//行 q[t].y=i;//列 vis[1][i]=true; } while(h<=t) { h++; for(int i=1; i<=4; i++) { int x=q[h].x+dctx[i]; int y=q[h].y+dcty[i]; if(height[q[h].x][q[h].y]>height[x][y]&&(!vis[x][y])) { t++; q[t].x=x; q[t].y=y; vis[x][y]=true; } } } } void dfs(int x,int y) { vis[x][y]=true; for(int i=1; i<=4; i++) { int tx=x+dctx[i],ty=y+dcty[i]; if(height[x][y]>height[tx][ty]&&vis[tx][ty]!=true) { dfs(tx,ty); } } } int main() { memset(height,0x3f,sizeof(height)); cin>>n>>m; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin>>height[i][j]; bfs(); for(int i=1; i<=m; i++) if(!vis[n][i]) cnt++; if(cnt!=0) { cout<<0<<endl<<cnt<<endl; return 0; } // dfs確定一個點可覆蓋的區間[x,y] // for(int i=1;i<=n;i++) // { // for(int j=1;j<=m;j++) // cout<<vis[i][j]<<‘ ‘; // cout<<endl; // } cnt=0; for(int i=1; i<=m; i++) { memset(vis,0,sizeof(vis)); dfs(1,i); cnt++; bool flag=false; for(int j=1; j<=m; j++) { if(flag==false&&vis[n][j]==true) { flag=true; val[cnt].x=val[cnt].y=j; } if(flag==true&&vis[n][j+1]==false) { val[cnt].y=j; break; } } val[cnt].len=val[cnt].y-val[cnt].x+1; } // 貪心每次取最大覆蓋區間 int maxn=1,tot=1,i=2; sort(val+1,val+1+cnt,cmp); for(int i=1; i<=cnt; i++) cout<<val[i].x<<‘ ‘<<val[i].y<<endl; while(val[maxn].y<m) { int tmp=maxn; while(i<=m&&val[i].x<=val[maxn].y+1) { if(val[i].y>val[tmp].y) tmp=i; i++; } maxn=tmp; tot++; } cout<<1<<endl<<tot<<endl; return 0; }

P1514 引水入城