您的位置:首页 > 其它

流感传染(C程序设计进阶第2周)

2015-11-09 18:41 302 查看
问题描述

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

输入

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。

接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

接下来的一行是一个整数m,m不超过100.

输出

输出第m天,得流感的人数

样例输入

5
....#
.#.@.
.#@..
#....
.....
4


样例输出

16


提示

源码中方法一是别人写的,很好。

方法二是自己写的,比较笨,用坐标来记忆。而且当把其中一部分变为屏蔽的代码后,提交就会提示说错误,现不知道错误在哪。待查找。

源码

方法一:

#include<iostream>
#include<stdio.h>
using namespace std;

int main()
{
char a[101][101];
int n, m, sum = 0;
cin >> n;
for(int i = 0;i < n; i++)
{
for(int j = 0; j < n; j++)
{
cin >> a[i][j];
}
}
cin >> m;
for(int d = 1; d <= m; d++)
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n;j++)
{
if(a[i][j] == '!')
a[i][j] = '@'; // 将前一天标记的人感染
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n;j++)
{
// 将感染人周围的人标记
if(a[i][j] == '@')
{
if(i + 1 <n && a[i + 1][j] == '.')
a[i + 1][j]='!';
if(j - 1 >= 0 && a[i][j - 1] == '.')
a[i][j - 1] = '!';
if(j + 1 < n && a[i][j + 1] == '.')
a[i][j + 1]='!';
if(i - 1 >= 0 && a[i - 1][j] == '.')
a[i - 1][j] = '!';
}
}
}

}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
{
if(a[i][j] == '@')
sum++;
}
}
cout << sum << endl;
return 0;
}


方法二:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
int n=0;
cin >> n;
vector<vector<char> > matrix(n, vector<char>(n));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> matrix[i][j];
}
}
int m=0;
cin >> m;

vector<int> coordX;
vector<int> coordY;
for (int day = 1; day < m; day++)
{
//找出所有流感坐标
coordX.clear();
coordY.clear();
//找出所有流感坐标
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '@')
{
coordX.push_back(i);
coordY.push_back(j);

}
}
}
for (unsigned int k = 0; k < coordX.size(); k++)
{
int x=0, y=0;
x = coordX[k]-1;
y = coordY[k];
if (x >= 0 && matrix[x][y] == '.')
{
matrix[x][y] = '@';
}

x = coordX[k];
y = coordY[k] - 1;
if (y >= 0 && matrix[x][y] == '.')
{
matrix[x][y] = '@';
}

x = coordX[k];
y = coordY[k] + 1;
if (y < n && matrix[x][y] == '.')
{
matrix[x][y] = '@';
}

x = coordX[k]+1;
y = coordY[k];
if (x < n && matrix[x][y] == '.')
{
matrix[x][y] = '@';
}
}
}

//      vector<int> coordX;
//      vector<int> coordY;
//      for (int day = 1; day < m; day++)
//      {
//          //找出所有流感坐标
//          coordX.clear();
//          coordY.clear();
//          for (int i = 0; i < n; i++)
//          {
//              for (int j = 0; j < n; j++)
//              {
//                  if (matrix[i][j] == '@')
//                  {
//                      coordX.push_back(i);
//                      coordY.push_back(j);
//                  }
//              }
//          }
//          //感染周围环境
//          for (int k = 0; k < coordX.size(); k++)
//          {
//              int x=0, y=0;
//              x = coordX[k]-1 < 0 ? 0 : coordX[k]-1;
//              y = coordY[k];
//              if (matrix[x][y] == '.')
//              {
//                  matrix[x][y] = '@';
//              }
//
//              x = coordX[k];
//              y = coordY[k]-1 < 0 ? 0 : coordY[k] - 1;
//              if (matrix[x][y] == '.')
//              {
//                  matrix[x][y] = '@';
//              }
//
//              x = coordX[k];
//              y = coordY[k]+1 > 4 ? 4 : coordY[k] + 1;
//              if (matrix[x][y] == '.')
//              {
//                  matrix[x][y] = '@';
//              }
//
//              x = coordX[k]+1 > 4 ? 4 : coordX[k]+1;
//              y = coordY[k];
//              if (matrix[x][y] == '.')
//              {
//                  matrix[x][y] = '@';
//              }
//          }
//      }

//输出
int num = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (matrix[i][j] == '@')
{
num++;
}
}
}
cout << num << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: