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 ...
随机推荐
- HTML的定位属性
position 用于定义一个元素是否absolute(绝对),relative(相对),static(静态),或者fixed(固定) top层距离顶点纵坐标的距离 left层距离顶点横坐标的距 ...
- hdu1166敌兵布阵_线段树单点更新
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...
- Euro Efficiency_完全背包
Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...
- Easy Problem-map和vector的使用
给出一个包含n个整数的数组,你需要回答若干询问.每次询问包含两个整数k和v,输出从左到右第k个v的下标(数组下标,从左右到右编号1~n). [输入格式] 输入包含多组数据.每组数据第一行为两个整数n和 ...
- taglib 自定义标签
自定义<%@ taglib prefix="cf" uri="http://training.bmcc.com.cn/tld/functions"%> ...
- break、continue与return见的区别
比较简单的说法就是: 1.break:跳出当前的循环体 2.continue:跳出本次的循环 3.return:返回调用函数(也就完全的跳出了函数块) 好,下面就是我的代码练习君了: package ...
- html--整站制作
1.样式初置 body,div,ul,ol,h1,h2,h3,h4,h5,p,form,input,textarea,select{margin:0;padding:0;} li{list-style ...
- codeforces 192a
link: http://codeforces.com/contest/330/problem/A brute force. /* ID: zypz4571 LANG: C++ TASK: 191a. ...
- Memcached安装及配置
一.Memcached介绍 1.Memcached是国外社区网站LiveJournal团队开发,通过缓存数据库查询结果,减少数据库访问次数,从而提高动态web站点性能. 2.官方站点http://me ...
- 全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中
题目名称 改造二叉树 数字对 交换 英文名称 binary pair swap 输入文件名 binary.in pair.in swap.in 输出文件名 binary.out pair.out sw ...