流感传染(为啥小弟我的运行结果总是18,而正确答案是16.新手勿喷)
流感传染(为啥我的运行结果总是18,而正确答案是16.新手勿喷)
流感传染
描述
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
输出
输出第m天,得流感的人数
样例输入
5
....#
.#.@.
.#@..
#....
.....
4
样例输出
16
我的程序是:
#include <iostream>
using namespace std;
int main(){
int n = 0, m = 0, count = 0;
char a[102][102] = { 0 };
cin >> n;
for (int i = 10; i < n + 10; i++){
for (int j = 10; j < n + 10; j++){
cin >> a[i][j];
}
}
for (int i = 10; i < n + 10; i++){
for (int j = 10; j < n + 10; j++){
cout<< a[i][j];
}
cout<<endl;
}
cin >> m; //m-1代表第m天
for (int x = 0; x < m-1;x++){ //如果不是空房间那么全部赋给@。
for (int i = 10; i < n + 10; i++){
for (int j = 10; j < n + 10; j++){
if (a[i][j] == '@'){
if (a[i + 1][j] != '#'){
a[i + 1][j] = '@';
}
if (a[i - 1][j] != '#'){
a[i - 1][j] = '@';
}
if (a[i][j + 1] != '#'){
a[i][j + 1] = '@';
}
if (a[i][j - 1] != '#'){
a[i][j - 1] = '@';
}
}
}
}
}
for (int i = 10; i < n + 10; i++){ //计算感冒的人数,用count表示。
for (int j = 10; j < n + 10; j++){
if (a[i][j] == '@'){
count++;
}
}
}
cout << count << endl;
return 0;
}
------解决思路----------------------
每天变一次, 我觉得你最好用a[2][102][102],开始在a[0], 第一天从a[0]->a[1], 第二天从a[1]->a[0], 这样就不会发现重复累计或者反复修改了了
列出部分代码
------解决思路----------------------
仅供参考:
------解决思路----------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
流感传染
描述
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
输出
输出第m天,得流感的人数
样例输入
5
....#
.#.@.
.#@..
#....
.....
4
样例输出
16
我的程序是:
#include <iostream>
using namespace std;
int main(){
int n = 0, m = 0, count = 0;
char a[102][102] = { 0 };
cin >> n;
for (int i = 10; i < n + 10; i++){
for (int j = 10; j < n + 10; j++){
cin >> a[i][j];
}
}
for (int i = 10; i < n + 10; i++){
for (int j = 10; j < n + 10; j++){
cout<< a[i][j];
}
cout<<endl;
}
cin >> m; //m-1代表第m天
for (int x = 0; x < m-1;x++){ //如果不是空房间那么全部赋给@。
for (int i = 10; i < n + 10; i++){
for (int j = 10; j < n + 10; j++){
if (a[i][j] == '@'){
if (a[i + 1][j] != '#'){
a[i + 1][j] = '@';
}
if (a[i - 1][j] != '#'){
a[i - 1][j] = '@';
}
if (a[i][j + 1] != '#'){
a[i][j + 1] = '@';
}
if (a[i][j - 1] != '#'){
a[i][j - 1] = '@';
}
}
}
}
}
for (int i = 10; i < n + 10; i++){ //计算感冒的人数,用count表示。
for (int j = 10; j < n + 10; j++){
if (a[i][j] == '@'){
count++;
}
}
}
cout << count << endl;
return 0;
}
------解决思路----------------------
每天变一次, 我觉得你最好用a[2][102][102],开始在a[0], 第一天从a[0]->a[1], 第二天从a[1]->a[0], 这样就不会发现重复累计或者反复修改了了
列出部分代码
int t=0;
for (int x = 0; x < m-1; x++) //如果不是空房间那么全部赋给@。
{
for (int i = 10; i < n + 10; i++)
{
for (int j = 10; j < n + 10; j++)
{
if(a[t][i][j]=='.')
a[1-t][i][j] =(a[t][i-1][j]=='@'
------解决思路----------------------
a[t][i+1][j]=='@'
------解决思路----------------------
a[t][i][j-1]=='@'
------解决思路----------------------
a[t][i][j+1]=='@') ? '@' : '.';
else a[1-t][i][j] =a[t][i][j];
}
}
t^=1;
}
// 统计a[t]即是答案
------解决思路----------------------
仅供参考:
//描述
//有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。
//在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),
//空房间不会传染。请输出第m天得流感的人数。
//
//输入
//第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
//接下来的n行,每行n个字符,'.'表示第一天该房间住着健康的人,'#'表示该房间空着,'@'表示第一天该房间住着得流感的人。
//接下来的一行是一个整数m,m不超过100.
//输出
//输出第m天,得流感的人数
//样例输入
//5
//....#
//.#.@.
//.#@..
//#....
//.....
//4
//样例输出
//16
#include<stdio.h>
#include<stdlib.h>
unsigned char a[100][101];
int r;//人数
int n;
int mm;
int ok(int yy,int xx) {
if (0<=yy && yy<n
&& 0<=xx && xx<n) return 1;
else return 0;
}
void flu(int m) {
int y,x,ny,nx;
if (m>=mm) return;
for (y=0;y<n;y++) {
for (x=0;x<n;x++) {
if (a[y][x]=='@'-1+m) {
ny=y-1;
nx=x;
if (ok(ny,nx) && a[ny][nx]=='.') {
a[ny][nx]='@'+m;
}
ny=y+1;
nx=x;
if (ok(ny,nx) && a[ny][nx]=='.') {
a[ny][nx]='@'+m;
}
ny=y;
nx=x+1;
if (ok(ny,nx) && a[ny][nx]=='.') {
a[ny][nx]='@'+m;
}
ny=y;
nx=x-1;
if (ok(ny,nx) && a[ny][nx]=='.') {
a[ny][nx]='@'+m;
}
}
}
}
for (y=0;y<n;y++) {
printf("%s\n",a[y]);
}
printf("----------%d\n",m+1);
flu(m+1);
}
int main() {
int y,x;
scanf("%d",&n);
if (n>100) n=100;
for (y=0;y<n;y++) {
scanf("%100s",a[y]);
}
scanf("%d",&mm);
printf("------------------------\n");
flu(1);
r=0;
for (y=0;y<n;y++) {
for (x=0;x<n;x++) {
if (a[y][x]!='#' && a[y][x]!='.') {
r++;
}
}
}
printf("%d\n",r);
return 0;
}
//5
//....#
//.#.@.
//.#@..
//#....
//.....
//4
//------------------------
//...A#
//.#A@A
//.#@A.
//#.A..
//.....
//----------2
//..BA#
//.#A@A
//.#@AB
//#BAB.
//..B..
//----------3
//.CBA#
//.#A@A
//.#@AB
//#BABC
//.CBC.
//----------4
//16
//
------解决思路----------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。