小岛问题

问题描述:比如给一个岛, 1 1 1 1 1 1 1 1     只有0的左右,上下都有1包围的时候才能算做小岛,所以这个图的小岛就是10,即中间封闭的0的格式,而两边的0都是没有封闭的,

                                                 1 0 0 0 0 0 1 1      不可计数。

                                                 1 1 0 0 0 1 1 0

                                                 0 1 0 0 1 1 0 0

                                                 1 1 1 1 1 1 1 1

思考:简单的遍历即可,在处理是否被包围的时候,只需要判断该数的上,下,左右,是否都大于等于1,即有1包围即可。

源代码:

#include <iostream>
using namespace std;
int island[100][100];
int num;
int jude(int x, int y)
{
//判断行
int tmp = 0;
for (int i = 0; i < y; i++)
tmp += island[x][i];
if (tmp < 1)
return 0;
else{
tmp = 0;
for (int i = y; i < num; i++)
if (i == y)
continue;
else
{
tmp += island[x][i];
}
if (tmp < 1)
return 0;
}


tmp = 0;
for (int i = 0; i < x; i++)
tmp += island[i][y];
if (tmp < 1)
return 0;
else{
tmp = 0;
for (int i = x; i < num; i++)
if (i == x)
continue;
else
{


tmp += island[i][y];
}
if (tmp < 1)
return 0;
}
return 1;

}
int main(void)
{
cin >> num;
int tmp;
int count = 0;
int i = 0;
getchar();
for (i = 0; i < num; i++)
for (int j = 0; j < num; j++)
cin >> island[i][j];
int ares = 0;
for (i = 0; i < num; i++)
for (int j = 0; j < num; j++)
{
if (island[i][j] == 0)
{
if (jude(i, j))
ares++;
}
}
cout << ares<<endl;
return 0;
}



//

代码没有写注释,因为思路比较简单,没有用到算法啥的。

                                  

这是一个有趣的问题,可以使用Python的随机模块和马尔可夫链来解决。 首先,我们需要定义“封闭小岛”是什么。在本文中,我们将定义一个封闭小岛为一个有限的网格状区域,其中每个格子可以是“陆地”或“水域”,并且每个陆地格子都与其上下左右四个格子之一相邻。我们的目标是通过随机游走,找到一个从任何一个陆地格子开始,可以到达的所有陆地格子的集合。 接下来,我们需要创建一个马尔可夫链模型来模拟随机游走。我们可以将每个陆地格子看作一个状态,并将转移概率定义为从当前状态到相邻状态的概率,即: - 如果相邻状态是水域,则转移概率为0。 - 如果相邻状态是陆地,则转移概率为相邻陆地格子的数量的倒数。 我们可以使用Python的numpy库来创建状态转移矩阵。假设我们的网格大小为n x n,则状态转移矩阵P的大小为n^2 x n^2,其中P[i][j]表示从状态i到状态j的转移概率。 接下来,我们需要使用随机模块生成一个从任何一个陆地格子开始的初始状态,并运用马尔可夫链模型进行随机游走,直到所有可达的陆地格子都被访问过。我们可以使用Python的numpy库和随机模块来实现这一过程。 最后,我们可以将所有已访问的陆地格子标记为已访问,然后重新运行随机游走过程,直到所有陆地格子都被标记为已访问为止。这样,我们就找到了所有可达的陆地格子的集合,即封闭小岛。 下面是一个Python示例代码,它实现了上述过程: ```python import numpy as np import random # 定义网格大小 n = 10 # 创建状态转移矩阵 P = np.zeros((n*n, n*n)) for i in range(n): for j in range(n): idx = i*n + j if i > 0: P[idx][idx-n] = 1 / 4 if i < n-1: P[idx][idx+n] = 1 / 4 if j > 0: P[idx][idx-1] = 1 / 4 if j < n-1: P[idx][idx+1] = 1 / 4 # 随机选择一个起始状态 start = random.randint(0, n*n-1) # 随机游走直到所有可达的陆地格子都被访问过 visited = set() visited.add(start) current = start while len(visited) < n*n: next_state = np.random.choice(n*n, p=P[current]) if next_state not in visited: visited.add(next_state) current = next_state # 标记所有已访问的陆地格子 land_visited = set() for state in visited: if random.random() < 0.5: land_visited.add(state) # 重新随机游走直到所有陆地格子都被访问过 while len(land_visited) < len(visited): current = random.choice(list(visited)) while current not in land_visited: next_state = np.random.choice(n*n, p=P[current]) if next_state in visited: current = next_state land_visited.add(current) # 输出结果 print(len(land_visited)) ``` 在这个示例代码中,我们首先定义了一个10 x 10的网格,然后创建了状态转移矩阵P。接下来,我们随机选择一个起始状态,运用马尔可夫链模型进行随机游走,直到所有可达的陆地格子都被访问过。然后,我们标记所有已访问的陆地格子,并重新随机游走直到所有陆地格子都被访问过。最后,我们输出所有已访问的陆地格子的数量,即封闭小岛的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值