pku2110求一点至另一点的路径中高度差最小的值
2011-07-24 11:09
302 查看
现在有一个N*N的矩阵,每个位置是一个整数,代表这点的高度,站在某个位置上的人,只能向上下左右四个方向移动,求从(1,1)至(N,N)间的所有路径中高度差最小的值。N<=100 height<=110
开始想直接借用最短路的思想做,但发现是错误的。还是用一般的想法吧,二分高度差+枚举最小高度。。。确定了这两个,高度的范围就确定了,那么可以直接广搜,但能不能从(1,1)至(N,N)。如果某个高度差可以找到一个最小高度,那么就将高度差减小,否则增加。
开始想直接借用最短路的思想做,但发现是错误的。还是用一般的想法吧,二分高度差+枚举最小高度。。。确定了这两个,高度的范围就确定了,那么可以直接广搜,但能不能从(1,1)至(N,N)。如果某个高度差可以找到一个最小高度,那么就将高度差减小,否则增加。
#include<iostream> using namespace std; int n,g[110][110],q[11000]; bool inq[11000]; int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; bool IN(int now,int s,int len) { if(now>=s&&now<=s+len) return true; return false; } bool IsIN(int x,int y) { if(x<0||x>=n) return false; if(y<0||y>=n) return false; return true; } bool OK(int s,int len) { int head=0,tail=0,i,j,k,ii,jj; memset(inq,false,sizeof(inq)); if(IN(g[0][0],s,len)) { inq[0]=true; q[tail++]=0; } while(head!=tail) { k=q[head++]; i=k/n,j=k%n; for(k=0;k<4;k++) { ii=i+next[k][0]; jj=j+next[k][1]; if(IsIN(ii,jj)&&!inq[ii*n+jj]&&IN(g[ii][jj],s,len)) { inq[ii*n+jj]=true; q[tail++]=ii*n+jj; } } } if(inq[n*n-1]) return true; return false; } int main() { int i,j,s,l,r,mid; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&g[i][j]); l=0,r=111; while(l<=r) { mid=(l+r)/2; for(s=0;s+mid<=110;s++) { if(OK(s,mid)) break; } if(s+mid<=110) { i=mid; r=mid-1; } else l=mid+1; } printf("%d\n",i); } return 0; }
相关文章推荐
- pku 3020 最小路径覆盖集
- bfs 较为全面的迷宫路径问题,包括路径的打印,起点到任一点的最小步数.
- pku 1422 Air Raid 最小路径覆盖图 解题报告
- swjtu1583 用DP或最小费用最大流求一点至另一点两条路径的最大价值,同一格点算一次
- [最小路径覆盖、二分图最大匹配]Pku3020--Antenna Placement
- pku 2594 Floyd+最小路径覆盖
- 牛顿迭代法代替二分 pku2728高度和除以距离和最小的生成树
- PKU2060 Taxi Cab Scheme - 最小路径覆盖
- pku2594 最小路径覆盖
- poj/pku 2594 (最小路径覆盖)
- PKU 3216(最小路径覆盖 + floyd)
- 最小边覆盖(最小路径覆盖)(路径不可相交)——pku2060
- poj 1041(欧拉回路+输出字典序最小路径)
- poj1751 highways 最小生成树记录路径
- POJ - 1422 Air Raid(DAG的最小路径覆盖数)
- 64. Minimum Path Sum 路径最小总和
- hdu 3861(tarjan 缩点 + 二分图匹配 求最小路径覆盖
- 高度最小的BST之程序员面试经典
- 矩阵最小路径和问题(升级版)
- ie6bug----ie6默认的最小高度是设定字体的高度