19,468
社区成员
发帖
与我相关
我的任务
分享
//我这个是用方法一的伪代码
enum State{Unknown,Border,Record};
//状态记录:未知,边界(刚接触到水),已记录最高水深
class CPoint{
public:
double dLocationX,dLocationY;//该点坐标,事实上可以用vInt的相对位置进行记录,只是相对麻烦点
double dHigh; //地表高度
State eState; //当前是否记录 等状态
double dMax_Depth; //该点存水最大深度
CPoint(double x,double y,double dhigh,double dDepth = 0,State cState=Unknown):
dLocationX(x),dLocationY(y),dHigh(dhigh),dMax_Depth(dDepth),eState(cState){
}; //默认为该点 CPoint 为未知
};
bool No_Invalid(double x,double y,vector<vector<CPoint> >& vInt){
//如果点 (x,y) 仍然在vInt 区域内,即为有效
//返回 true 否则返回false;
}
int main(){
vector<vector<CPoint> > vInt;
vector<double> vScale;
//初始化输入数据:略
// 具体为 vInt为区域 M*N 区域点初始化
// vScale 为区域内各种可能的高度(不重复)//////给所有区域高度排序一下,删除重复高度即可
//输入数据后必须是得到一个矩形区域(所有点为未知). 否则后面处理将出错.(后面程序均没对区域 vInt进行是否有效进行判断)
if(vInt.size()< 3 || vInt.begin()->size() < 3){
cout<<"没有积水"<<endl;
return 0;
}
vector<CPoint> vBorder;
for(vector<CPoint>::iterator p = vInt.begin()->begin();p != vInt.begin()->end();++p){
vBorder.push_back(*p);
p->eState = Border;
}
for(vector<CPoint>::iterator p = vInt.end()->begin();p != vInt.end()->end();++p){
vBorder.push_back(*p);
p->eState = Border;
}
for(vector<vector<CPoint> >::iterator p = vInt.begin()+1;p != vInt.end()-1;++p){
vBorder.push_back(* p->begin());
p->begin()->eState = Border;
vBorder.push_back(*(p->end()-1));
(p->end()-1)->eState = Border;
}
//以上为记录M*N边界的的CPoint 为边界(刚接触到水)
for(vector<double>::iterator pDepth = vScale.begin();pDepth != vScale.end();++ pDepth){
for(vector<CPoint>::iterator p = vBorder.begin();p != vBorder.end();++p){
//如果 *p (坐标为 (p->x,p->y)相邻的四个相邻区域 CPoint Ki(坐标为 (x-1,y),(x+1,y),(x,y-1),(x,y+1) 是否有效 调
// 用No_Invalid(p->x,p->y,vInt)进行判断
//为未知 (Ki.eState ==Unknown)且 && 地表不高于现在的水位深度 (Ki.dHigh <= *pDpeth)
//该CPoint Ki 放入 vBorder vBorder.push_back(Ki);
//改该点状态为Border,并记录此时水位为该点的最大水深 Ki.eState= Border; Ki.dMax_Depth= *pDepth; //Ki为vInt的对应单元
}
for(vector<CPoint>::iterator p = vBorder.begin();p != vBorder.end();++p){
//如果*p 相邻四个区域 没有未知的,从vBorder删除*p (vBorder.delete(*p))
} //删除不可能增加边界的CPoint (Border) 的 CPoint ,减少下一次更高水位历遍的数量
} //实际上是使用图历遍所有该水位能到达的区域
//至此为各个CPoint 能存的最大水深均存在了vInt
//进行统计一下即可
cout<<endl;
return 0;
}