问题描述:一个坐标表格,每个单元表格就代表一个地方有传染病病毒存在。
无病毒的地方用0标记,有病毒的地方用1标记。(为了方便表示边界,我在周围加了个-1的墙壁)
而我们实际常常研究的是估算受感染程度,该程序需要在接收一个坐标为输入后以该点为中心向周围的8个方向进行递归拓展,检查周围区域是否被感染。得到的菌群用2来标记。类似的应用有图像处理上的ps可以用这个算法找出某种颜色值的分布。
然后要考虑到边界问题:遇到边界应当终止递归。另外还要排除已经访问过的点,即遇到的话也退出递归。
对此我用了个结构体node描述每个区域,offset结构体描述方向。
下面是我的代码:
#include
using namespace std;
struct node
{
intvalue;
// 值为0 无毒,-1(边界墙壁), 1有毒
bool bCheck;
intfindvirus;
// 发现了有病毒,就给标记为1;
};
struct offset
{
int x;
int y;
};
offsetmove[9];
// 本来是6的,但是为了加一层的墙壁,就变8了,墙壁上的值为-1,没有检查为0,检查了为1
node array[8][8];
// 没有病毒为0,有病毒为1void InitArray()
{
// 先初始化(墙壁-1,没有病毒为0,有为1) 刚开始的话所有都是未被访问的。应为被我memset为0了呗。。。
memset(array,0, sizeof(node)*64);
for (int i=0;
i<8;
i++)
{
array[i][0].value=https://www.it610.com/article/-1;
array[0][i].value=-1;
array[7][i].value=-1;
array[i][7].value=-1;
}
array[1][1].value=1;
array[2][2].value=1;
array[3][3].value=1;
array[3][4].value=1;
array[3][6].value=1;
array[4][4].value=1;
array[4][3].value=1;
array[4][6].value=1;
array[5][1].value=1;
array[5][3].value=1;
array[5][4].value=1;
array[5][6].value=1;
array[6][1].value=1;
/
move[0].x=0;
// 不动 自己的位置
move[0].y=0;
move[1].x=0;
move[1].y=-1;
// N
move[2].x=1;
// NE
move[2].y=-1;
move[3].x=1;
//E
move[3].y=0;
move[4].x=1;
//ES
move[4].y=1;
move[5].x=0;
// S
move[5].y=1;
move[6].x=-1;
//WS
move[6].y=1;
move[7].x=-1;
// W
move[7].y=0;
move[8].x=-1;
// WN
move[8].y=-1;
}
void ShowInitValue()
{
for (int i=0;
i<8;
i++)
{
for (int j=0;
j<8;
j++)
{
if (array[i][j].findvirus==0)
{
cout<>x;
cout<<"请输入起始点的y的坐标值:";
cin>>y;
RecursiveWork(x,y);
// 外部调用递归ShowInitValue();
return 0;
}
允许结果如下:
文章图片
【C/C++|经典算法之传染病问题】
文章图片
转自:
http://blog.csdn.net/qxbailv15/article/details/8961836
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析