/*==========================================================
流感传染
总时间限制: 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. BZOJ 3439 Kpm的MC密码

    倒着建trie,然后主席树来求子树第k大. #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  2. UI基础:UITableView的编辑和移动

    相对UITableViiew进行编辑,必须设置代理,让代理遵循UITableViewDataSource和UITableViewDelegate协议.因为需要代理实现协议中几个必须的方法. UITab ...

  3. Cow Exhibition_背包(负数情况)

    Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - ...

  4. 负margin居中

    <!DOCTYPE html><html> <head> <title> new document </title> <meta na ...

  5. 修正magento快速搜索返回结果不准确

    有时候发现用magento的mini 快速搜索搜出来的结果一点都不准确,跟实际结果相差甚大,这里发现修改一个地方即可修复这个问题. 打开app/code/core/Mage/CatalogSearch ...

  6. Visual Studio 2010 单元测试

    转载出处:http://blog.csdn.net/tjvictor/article/details/6175362

  7. arduino上使用sprintf()函数输出float值出错

    如果尝试使用sprintf()函数在arduino上进行对float指转换为一个字符串的话,你会发现,it doesn't work.弄了很久,还以为是没学c++的原因.其实在arduino上,这个函 ...

  8. win7 64 下安装ubuntu14.04

    win7下安装ubuntu方法: * 使用win7下的自带的分区工具给ubuntu留出磁盘空间:计算机 -> 右键菜单选择管理 -> 选择磁盘管理->选中最后的那个磁盘->右键 ...

  9. Java-->简单的斗地主发牌流程

    package com.dragon.java.hwddz; import java.util.ArrayList; import java.util.HashMap; import java.uti ...

  10. Web应用开发工具及语言需要具备的功能探索

    1 前言 最近一个多月在做Web项目,用到的技术有(也不算泄漏公司机密吧): 后台:Struts 2(with JSP/FreeMarker).Spring.Hibernate.MySQL.Web S ...