/*==========================================================
流感传染
总时间限制: 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计算概论-流感传染【这个题用二维数组】的更多相关文章

  1. 剑指Offer编程题1——二维数组中的查找

    剑指Offer编程题1---------------二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完 ...

  2. Openjudge-NOI题库-二维数组回形遍历

    题目描述 Description 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组.如图所示:  输入输出格式 Input/ou ...

  3. 剑指 offer 第一题: 二维数组中的查找

    打算写 图解剑指 offer 66 题 的系列文章,不知道大家有没有兴趣

  4. 剑指Offer_编程题之二维数组中的查找

    题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.

  5. 《剑指offer》第四题(二维数组中的查找)

    // 二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 // 整数,判断数组 ...

  6. [剑指offer]第1题,二维数组中的查找

    ①题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  7. OpenJudge计算概论-取石子游戏

    OpenJudge计算概论-取石子游戏[函数递归练习] /*====================================================================== ...

  8. ytu 1050:写一个函数,使给定的一个二维数组(3×3)转置,即行列互换(水题)

    1050: 写一个函数,使给定的一个二维数组(3×3)转置,即行列互换 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 112[ ...

  9. Java数组排序基础算法,二维数组,排序时间计算,随机数产生

    import java.util.Arrays; //包含Arrays import java.util.Random; public class HelloWorld { public static ...

随机推荐

  1. 原生javascript Ajax

    代码 1. IE5 ,IE6 使用ActiveXObject对象,   其余现代浏览器都支持XMLHttpRequest对象: function ajaxObject(){ var xmlhttp; ...

  2. yii2 利用小部件生成后台左边菜单栏

    ************   模型层递归查询权限   ************ /**     * 递归方式查询权限     */    public function getPrivilege()  ...

  3. Inherits、CodeFile、CodeBehind的区别

    Inherits.CodeFile.CodeBehind 在 ASP.NET 中使用代码隐藏方法来设计Web 窗体,可使页代码能够更清晰地从 HTML 内容中分离到完全单独的文件中. 通常一个 @pa ...

  4. 对dataTable去重

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.T ...

  5. C# Listview 第一列不能居中

    /********************************************************************** * C# Listview 第一列不能居中 * 说明: ...

  6. Qt之QPropertyAnimation

    简述 QPropertyAnimation类定义了Qt的属性动画. QPropertyAnimation以Qt属性做差值,作为属性值存储在QVariants中,该类继承自QVariantAnimati ...

  7. 多个Tomcat同时运行环境配置 - imsoft.cnblogs

    解压下载好的Tomcat压缩包,两次.此例中分别命名为tomcat和tomcat2. 1. 在MyEclipse中配置好第一个Tomcat环境,可以正常运行项目后. 2. 再配置tomcat2这个项目 ...

  8. hdu 5190 Building Blocks

    问题描述 看完电影后,乐乐回家玩起了积木. 他已经搭好了n堆积木,他想通过调整积木,使得其中有连续W堆积木具有相同的高度,同时他希望高度恰好为H. 乐乐的积木都这了,也就是说不能添加新的积木,只能移动 ...

  9. iOS学习笔记---oc语言第九天

    初级内存管理 iOS应用程序出现crash(闪退),90%以上是内存问题////其他:数组越界,方法只声明没实现 内存问题体现在两个方面:内存溢出\野指针异常 内存溢出:程序运行超出内存上限 野指针异 ...

  10. ion-nav-view的学习 和理解

    当用户在你的app中浏览时,Ionic能够保持检测他们的浏览历史.通过了解他们的浏览历史,向左或向右滑动时可以正确的在视图间转换,或不转换.一个额外的好处是Ionic的导航系统具有可以管理多个历史记录 ...