KamaCoder 102. 沉没孤岛

题目描述:

给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域,且完全被水域单元格包围。孤岛是那些位于矩阵内部、所有单元格都不接触边缘的岛屿。

现在你需要将所有孤岛“沉没”,即将孤岛中的所有陆地单元格(1)转变为水域单元格(0)。

输入描述:

第一行包含两个整数 N, M,表示矩阵的行数和列数。

之后 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。

输出描述

输出将孤岛“沉没”之后的岛屿矩阵。

输入示例:
4 5
1 1 0 0 0
1 1 0 0 0
0 0 1 0 0
0 0 0 1 1

 

将孤岛沉没:

 

思路

学习上一个题目,先沿着边把两边的岛屿标记,然后再遍历一边地图,遇到陆地且没有进行过标记的都标记成水域就完成了。

步骤一:深搜或者广搜将地图周边的 1 (陆地)全部改成 2 (特殊标记)如果使用另一个visited数组则比较麻烦

步骤二:将水域中间 1 (陆地)全部改成 水域(0)

步骤三:将之前标记的 2 改为 1 (陆地)

C++深度优先搜索
#include<iostream>
#include<vector>
using namespace std;
int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};
void dfs(vector<vector<int>>& grid, int x, int y) {
    grid[x][y] = 2;
    for (int i = 0; i < 4; ++i) {
        int nextx = x + dir[i][0];
        int nexty = y + dir[i][1];
        if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;
        if (grid[nextx][nexty] == 0 || grid[nextx][nexty] == 2) continue;
        dfs(grid, nextx, nexty);
    }
    return;
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>> grid(n, vector<int>(m, 0));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> grid[i][j];
        }
    }
    // 步骤一:
    // 从左侧边,和右侧边 向中间遍历
    for (int i = 0; i < n; i++) {
        if (grid[i][0] == 1) dfs(grid, i, 0);
        if (grid[i][m - 1] == 1) dfs(grid, i, m - 1);
    }

    // 从上边和下边 向中间遍历
    for (int j = 0; j < m; j++) {
        if (grid[0][j] == 1) dfs(grid, 0, j);
        if (grid[n - 1][j] == 1) dfs(grid, n - 1, j);
    }
    // 步骤二、步骤三
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (grid[i][j] == 1) grid[i][j] = 0;
            if (grid[i][j] == 2) grid[i][j] = 1;
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << grid[i][j] << " ";
        }
        cout << endl;
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 泰坦尼克号沉没事件是历史上最著名的船难之一,许多人在这场悲剧中失去了生命。在这里,我将向您介绍如何使用Python分析泰坦尼克号数据集,以了解哪些因素可能与生存率有关。 首先,我们需要导入必要的库,包括pandas, numpy, matplotlib和seaborn。 ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline ``` 接下来,我们将使用Pandas加载数据集。这个数据集包含了泰坦尼克号上900多名乘客和船员的信息,包括他们的年龄、性别、船票等级、是否存活等。 ```python # 加载数据集 titanic_data = pd.read_csv('titanic_data.csv') ``` 我们可以使用head()函数查看数据集的前几行,以确保数据正确加载。 ```python titanic_data.head() ``` 接下来,我们将对数据集进行一些基本的探索性数据分析(EDA)。首先,我们将检查数据集中是否存在缺失值。 ```python # 检查缺失值 titanic_data.isnull().sum() ``` 如果存在缺失值,我们需要决定如何处理它们。对于这个数据集,我们可以填充缺失值或将其删除。在这里,我们将简单地删除缺失值。 ```python # 删除缺失值 titanic_data.dropna(inplace=True) ``` 接下来,我们将探索一些基本的统计数据,例如生存率、年龄分布、性别分布、船票等级分布等。 ```python # 生存率 sns.countplot(x='Survived', data=titanic_data) plt.title('Survival Count') plt.show() # 年龄分布 sns.distplot(titanic_data['Age']) plt.title('Age Distribution') plt.show() # 性别分布 sns.countplot(x='Sex', data=titanic_data) plt.title('Gender Count') plt.show() # 船票等级分布 sns.countplot(x='Pclass', data=titanic_data) plt.title('Passenger Class Count') plt.show() ``` 我们可以使用这些可视化工具来获得有关数据集的更多信息。例如,我们可以看到大多数乘客都没有幸存下来,年龄分布呈正态分布,男性乘客比女性乘客多,而且大多数乘客都在第三等舱。 接下来,我们将探索一些可能与生存率有关的因素。例如,我们可以查看不同性别和船票等级的生存率。 ```python # 不同性别的生存率 sns.barplot(x='Sex', y='Survived', data=titanic_data) plt.title('Survival Rate by Gender') plt.show() # 不同船票等级的生存率 sns.barplot(x='Pclass', y='Survived', data=titanic_data) plt.title('Survival Rate by Passenger Class') plt.show() ``` 我们可以看到女性的生存率远高于男性,而且在更高的船票等级中,生存率也更高。 最后,我们可以使用机器学习算法来预测乘客是否存活。在这里,我们将使用逻辑回归算法。 ```python # 将性别转换为数字 titanic_data['Sex'] = pd.get_dummies(titanic_data['Sex'], drop_first=True) # 将数据集拆分为训练集和测试集 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(titanic_data.drop('Survived', axis=1), titanic_data['Survived'], test_size=0.30, random_state=101) # 训练逻辑回归模型 from sklearn.linear_model import LogisticRegression logmodel = LogisticRegression() logmodel.fit(X_train,y_train) # 预测测试集 predictions = logmodel.predict(X_test) # 评估模型 from sklearn.metrics import classification_report print(classification_report(y_test, predictions)) ``` 我们可以看到,逻辑回归模型的准确率为81%。 这只是一个简单的示例,演示了如何使用Python进行泰坦尼克号数据集的分析。通过进一步的探索性数据分析和使用其他机器学习算法,您可以深入了解数据集并进行更准确的预测。 ### 回答2: 泰坦尼克号是一艘著名的豪华客轮,于1912年4月15日在首次航行时不幸沉没。这场悲剧导致了超过1500人的死亡,成为历史上最臭名昭著的海难之一。我们可以使用Python编程语言来模拟和分析这一事件。 首先,我们可以使用Python的数据处理和分析库,如Pandas和NumPy,来处理和分析有关泰坦尼克号的数据。我们可以使用这些库读取并分析乘客的信息,如年龄、性别、船舱等级等。这将帮助我们了解乘客的分布和特征。 其次,我们可以使用Python的可视化库,如Matplotlib和Seaborn,来创建图表和图形,以更直观地展示乘客的生存情况。我们可以根据性别、年龄、船舱等级等因素,绘制生存和死亡的柱状图或饼图,从而找出悲剧中的生存趋势。 此外,我们还可以使用Python的统计库,如Scipy和Statsmodels,来进行统计分析。我们可以使用这些库来对乘客的数据进行假设检验,找出与生存率显著相关的因素。例如,我们可以使用方差分析(ANOVA)来比较不同船舱等级之间的生存率是否存在差异。 最后,我们还可以使用Python的机器学习库,如Scikit-learn,来构建预测模型,以预测乘客的生存情况。我们可以使用历史数据作为训练集,通过选择合适的特征和算法来构建模型。然后,我们可以使用该模型来预测其他未知乘客的生存率。 总之,通过使用Python编程语言和相关的数据处理、可视化、统计和机器学习库,我们可以对泰坦尼克号的沉没事件进行详细的分析和模拟。这将帮助我们更全面地了解这一历史事件,并对乘客的生存情况进行深入研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值