1051A New Growth Industry ACM题答案 java版

题意:

A biologist experimenting with DNA modification of bacteria has found a way to make bacterial colonies sensitive to the
surrounding population density.
By changing the DNA, he is able to "program" the bacteria to respond to the
varying densities in their immediate neighborhood.
一位生物学家做实验修改细菌的DNA使得细菌受它周围细菌密度的影响。通过修改DNA,他可以给细菌“编程”使得细菌对它们近邻的密度变化产生反应。
The culture dish is a
square, divided into 400 smaller squares (20x20). Population in each small
square is measured on a four point scale (from 0 to 3). The DNA information is
represented as an array D, indexed from 0 to 15, of integer values and is
interpreted as follows:
培养皿是正方形的,被分成了400个更小的正方形。每一个小块的细菌数量由0到3四个数表示。DNA的信息被放在一个数组D里,数组标号从0到15.如下解释:
In any given culture dish square, let K be the
sum of that square‘s density and the densities of the four squares immediately
to the left, right, above and below that square (squares outside the dish are
considered to have density 0). Then, by the next day, that dish square‘s density
will change by D[K] (which may be a positive, negative, or zero value). The
total density cannot, however, exceed 3 nor drop below 0.
在培养皿一个给定的小正方形里,设K是该小正方形的密度,和紧邻着它的上下左右四个小正方形密度的和(培养皿外面的密度被认为是0)。接着,第二天,这个小正方形里的密度会按照D[K]改变(D[K]可能是正的,负的或者0).但最终小正方形里的密度不会超过3或者低于0.
Now, clearly,
some DNA programs cause all the bacteria to die off (e.g., [-3, -3, ..., -3]).
Others result in immediate population explosions (e.g., [3,3,3, ..., 3]), and
others are just plain boring (e.g., [0, 0, ... 0]). The biologist is interested
in how some of the less obvious DNA programs might behave.
现在很明显,一些DNA程序导致细菌死光(比如[-3, -3, ..., -3])。还有一些导致细菌数量激增(比如 [3,3,3, ..., 3]),另外一些不会引起什么变化(比如 [0,0,0, ..., 0])。生物学家想知道一些并不明显的DNA程序会带来怎样的影响。
Write a
program to simulate the culture growth, reading in the number of days to be
simulated, the DNA rules, and the initial population densities of the dish.

写一个程序模拟这些变化,读入需要模拟的天数,DNA规则和培养皿中细菌初始的密度。

思路:这个题卡了很久,本来在自己电脑上测试怎么测怎么对,但是提交就是wrong answer。走了很多弯路,还是没成功,就搜了网上的答案。看到自己的思路就是对的。但是人家高明的地方在于计算K,在我的程序中我用sum表示的,也就是五个小正方形的密度和。本来我只用了20*20的数组来放各小正方形的密度。所以计算的时候需要分开考虑 在边上和在角上的小正方形,在我的程序中计算sum分了i=0,j!=0且j<19等多种情况。当时还觉得自己考虑仔细,但是看到那位作者直接用了22*22的数组,这样边上和角上不用分开考虑,按这样提交,accepted!可能我那个分的情况太多,不知哪里还是有漏洞。。。所以ACm题要好好思考。。。。。

那位作者的链接http://blog.csdn.net/wankaiming/article/details/8104857   他用的c++

import java.util.Scanner;

public class ANewGrowth1051 {
static int sum = 0;// the sum of that square‘s density and the densities of
// the four squares immediately to the left, right,
// above and below that square
static int[][] ini = new int[22][22];// 每个小方块中的密度
static int num = 1;// 需要模拟的次数,默认为1
static int days = 0;// 要模拟的天数

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
int[] arrayD = new int[16];// DNA information
num = sc.nextInt();

for (int i = 0; i < num; i++) {
days = sc.nextInt();// 读入天数
for (int j = 0; j < 16; j++)
// 读入DNA information
arrayD[j] = sc.nextInt();
for (int k = 1; k < 21; k++)
// 读取初始密度
for (int m = 1; m < 21; m++)
ini[k][m] = sc.nextInt();
for (int z = 0; z < days; z++) {
calculate(arrayD);
}

for (int x = 1; x < 21; x++) {
for (int y = 1; y < 21; y++) {
if (ini[x][y] == 0)
System.out.print(".");
else if (ini[x][y] == 1)
System.out.print("!");
else if (ini[x][y] == 2)
System.out.print("X");
else if (ini[x][y] == 3)
System.out.print("#");
}
System.out.println();
}
if (i < num - 1)
System.out.println();
}

}

public static void calculate(int[] arrayD) {
int[][] then = new int[22][22];

for (int i = 1; i < 21; i++) {
for (int j = 1; j < 21; j++) {
sum = ini[i - 1][j] + ini[i + 1][j] + ini[i][j - 1]
+ ini[i][j + 1] + ini[i][j];// 计算sum

then[i][j] = ini[i][j] + arrayD[sum];//之所以用到then[][]是因为后面的计算需要用到前面的密度,所以算出来之后不能马上改变密度值,先放在then里面
if (then[i][j] < 0)//不能低于0或者超过3
then[i][j] = 0;
if (then[i][j] > 3)
then[i][j] = 3;

}
}
ini = then;
}

}

 

时间: 2024-10-10 09:25:54

1051A New Growth Industry ACM题答案 java版的相关文章

1115Digital Roots ACM题答案 java版

//这个题开始自己运行没问题了,提交runtime error. 很不解,网上查到一般是数组越界,后来自己又测试,发现当输入的数过大,超过int //范围的时候Integer.parseInt(st) 就会报错.所以对程序做了修改,之后accepted. import java.util.Scanner; public class DigitalRoots1115 { public static void main(String[] args) { Scanner sc = new Scanne

1049 I Think I Need a Houseboat ACM题答案 java版

package arithmetic; import java.util.Scanner; public class IThinkI1049 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int num = sc .nextInt(); int years = 0; double pai=3.1416; double x=0,y=0; for(int i=0;i<num;i++){

1151Word Reversal ACM题答案 java版

import java.util.Scanner; public class WordReversal1151 { static int N = 0;// N个输入块 static int num;// 每个输入块里有多少句话 static String blank_line; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); for (int i = 0

java面试题及答案java面试题及答案

java面试题及答案(基础题122道,代码题19道) JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象.2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始

HDOJ1057 A New Growth Industry 【模拟】

A New Growth Industry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1197    Accepted Submission(s): 474 Problem Description A biologist experimenting with DNA modification of bacteria has fou

可以使用C#语言的在线ACM题库

俄罗斯乌拉尔大学在线题库 是一个可以使用C#语言的在线ACM题库,有兴趣的朋友可以去试试. Problem 1000. A+B Problem 是入门,就是简单地求整数 A 和 B 的和就行了,答案如下: 1 using System; 2 3 // http://acm.timus.ru/problem.aspx?space=1&num=1000 4 class Acm1000 5 { 6   static void Main() 7   { 8     string[] ss = Conso

在ACM中使用Java语言

一 每个语言都有各自的优点,在做ACM题的时候如果使用Java对于新手可能需要注意几点: 1, Java的代码提交时要以Main为主类的名字. 2, 因为主类中的main方法为public static void类型,所以在里面使用的方法和变量也需要是static类型,除此之外,还可以通过实例化一个对象来调用. public class Main { ... void f(int a) { ... } public static void main(String args[]) { ... Ma

北大ACM题库习题分类与简介(转载)

在百度文库上找到的,不知是哪位大牛整理的,真的很不错! zz题 目分类 Posted by fishhead at 2007-01-13 12:44:58.0 -------------------------------------------------------------------------------- acm.pku.edu.cn 1. 排序 1423, 1694, 1723, 1727, 1763, 1788, 1828, 1838, 1840, 2201, 2376, 23

hdu5351 MZL&#39;s Border(规律题,java)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud MZL's Border Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 905    Accepted Submission(s): 295 Problem Description As is known to all,