OpenJudge计算概论-流感传染【这个题用二维数组】
/*==========================================================
流感传染
总时间限制: 1000ms 内存限制: 65536kB
描述
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。 输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
输出
输出第m天,得流感的人数
样例输入
5
....#
.#.@.
.#@..
#....
.....
4
样例输出
16
============================================================*/
#include<stdio.h>
#include<string.h>
char a[][],b[][],n;//b数组是做为暂存中间结果的数组,以免今天刚感染的那些人对他周围的人马上也传染过去。
void fun(int i,int j);//使a[i][j]周围的人感染流感
int main()
{
int m,i,j,k,s; freopen("7.in","r",stdin);
scanf("%d",&n);
for(i=;i<n;i++)
{
scanf("%s",a[i]);
strncpy(b[i],a[i],n);
}
scanf("%d",&m);
for(k=;k<=m;k++)
{
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
if(a[i][j]=='@')//这里是检测病人然后处理其周围的人。其实也可检测正常人然后看他周围是否有病人会传染给他。不过,其实道理都一样,也要存储中间结果。
{
fun(i,j);
}
}
}
for(i=;i<n;i++)
{
strncpy(a[i],b[i],n);
}
}
s=;
for(i=;i<n;i++)
{
/*printf("%s\n",a[i]);*/
for(j=;j<n;j++)
{
if(a[i][j]=='@')
{
s++;
}
}
}
printf("%d\n",s);
return ;
}
void fun(int i,int j)
{
int x,y;
x=i-;y=j;
if(x>=&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当x<0时先判断a[x][y]是否等于‘.’就错了,下标越界了。
{
b[x][y]='@';
}
x=i+;y=j;
if(x<n&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当x>=n时先判断a[x][y]是否等于‘.’就错了,下标越界了。
{
b[x][y]='@';
}
x=i;y=j-;
if(y>=&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当y<0时先判断a[x][y]是否等于‘.’就错了,下标越界了。
{
b[x][y]='@';
}
x=i;y=j+;
if(y<n&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当y>=n时先判断a[x][y]是否等于‘.’就错了,下标越界了。
{
b[x][y]='@';
}
}
下面是另外一个方法,可以把新感染的人标记为其他符号,这样就免掉了另外一个数组,可以省一点空间。
#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
char a[][];
int i,n,j,d,m,sum=;
freopen("5.in","r",stdin);
//freopen("result.out","w",stdout);
cin>>n;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
cin>>a[i][j];
}
}
cin>>m;
/*调试性输出
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<a[i][j];
}
cout<<endl;
}*/ for(d=;d<=m;d++)
{
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
if(a[i][j]=='@')
{
if(i+<n&&a[i+][j]=='.')
a[i+][j]='!';
if(j->=&&a[i][j-]=='.')
a[i][j-]='!';
if(j+<n&&a[i][j+]=='.')
a[i][j+]='!';
if(i->=&&a[i-][j]=='.')
a[i-][j]='!';
}
}
}
/*调试性输出
cout<<endl<<"===========第"<<d<<"天================"<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<a[i][j];
}
cout<<endl;
}*/
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
if(a[i][j]=='!')
a[i][j]='@';
}
}
}
sum=;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
if(a[i][j]=='@')
sum++;
}
}
cout<<sum<<endl;
return ;
}
简陋的递归:
#include<iostream>
#include<stdio.h>
using namespace std; char a[][];
int n,m; void fun(int k);//表示当前根据第k-1天的结果计算第k天的数据 int main()
{
int i,j,d,sum=;
//freopen("data.in","r",stdin);
cin>>n;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
cin>>a[i][j];
}
}
cin>>m;
/*调试性输出
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<a[i][j];
}
cout<<endl;
}*/
fun();
sum=;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
if(a[i][j]=='@')
sum++;
}
}
cout<<sum<<endl;
return ;
}
void fun(int k)//表示当前根据第k-1天的结果计算第k天的数据
{
int i,j;
if(k>m) return;
else
{
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
if(a[i][j]=='@')
{
if(i+<n&&a[i+][j]=='.') a[i+][j]='!';
if(j->=&&a[i][j-]=='.') a[i][j-]='!';
if(j+<n&&a[i][j+]=='.') a[i][j+]='!';
if(i->=&&a[i-][j]=='.') a[i-][j]='!';
}
}
} for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
if(a[i][j]=='!')
a[i][j]='@';
}
}
/*printf("\n----------------------------------\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<a[i][j];
}
cout<<endl;
}*/
fun(k+);
}
}
OpenJudge计算概论-流感传染【这个题用二维数组】的更多相关文章
- 剑指Offer编程题1——二维数组中的查找
剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...
- Openjudge-NOI题库-二维数组回形遍历
题目描述 Description 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组.如图所示: 输入输出格式 Input/ou ...
- 剑指 offer 第一题: 二维数组中的查找
打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣
- 剑指Offer_编程题之二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.
- 《剑指offer》第四题(二维数组中的查找)
// 二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 // 整数,判断数组 ...
- [剑指offer]第1题,二维数组中的查找
①题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- OpenJudge计算概论-取石子游戏
OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...
- ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)
1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 154 Solved: 112[ ...
- Java数组排序基础算法,二维数组,排序时间计算,随机数产生
import java.util.Arrays; //包含Arrays import java.util.Random; public class HelloWorld { public static ...
随机推荐
- Ubuntu下Eclipse中文乱码问题解决(转)
Ubuntu下Eclipse中文乱码问题解决 把Windows下的工程导入到了Linux下Eclipse中,由于以前的工程代码,都是GBK编码的(Windows下的Eclipse 默认会去读取系统的编 ...
- JavaScript封装的几种方式
JS 对象封装的常用方式 JS是一门面向对象语言,其对象是用prototype属性来模拟的.来看看如何封装JS对象. 常规封装 function Person (name,age,sex){ this ...
- CRM客户关系管理系统(十三)
---客户资料添加 1.事件流程:
- iOS提交AppStore被拒原因
1. Terms and conditions(法律与条款) 1.1 As a developer of applications for the App Store you are bound by ...
- HDU 3932
http://acm.hdu.edu.cn/showproblem.php?pid=3932 一定范围的平面上给一些点,求到这些点的最大距离最小,和上一题的题意正好相反,稍微改一下就可以 这个问题又叫 ...
- How to install more voices to Windows Speech?
!!!WARNING!!! This involves manual edits to your registry. If you mess it up, don't blame me. Do at ...
- 分享25个CSS前端网页设计常用技巧
1.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值.2.同一个的class选择符可以在一个文档中重复出现,而id选择符却只能出现一次;对一个标签同时使用class ...
- Web 数据可视化
/***************************************************************************************** * Web 数据可 ...
- jquery ui tab标签
<!DOCTYPE html> <html> <head> <title>tab</title> <style type=" ...
- igv
integrative genomics viewer 下载: http://www.broadinstitute.org/igv/download 下载前要注册 导入参考基因组:http://www ...