1. 程式人生 > >中國MOOC_面向對象程序設計——Java語言_期末考試編程題_1細胞自動機

中國MOOC_面向對象程序設計——Java語言_期末考試編程題_1細胞自動機

system static jna 提示 add 課程 else ast bmi

期末考試編程題

返回

這是期末考試的編程題

溫馨提示:

1.本次考試屬於Online Judge題目,提交後由系統即時判分。

2.學生可以在考試截止時間之前提交答案,系統將取其中的最高分作為最終成績。

1 細胞自動機(30分)

題目內容:

這是細胞自動機的非圖形版本。細胞自動機是指在一個二維網格內,每一個網格是一個細胞。每個細胞有活和死兩種狀態。

初始時刻,有些細胞是活的,有些細胞是死的。自動機的每一步,根據每個細胞周圍8個格子內的其他細胞的生存情況決定這個細胞下一步是否存活。具體的規則如下:

  • 如果該細胞現在是活的,並且周圍8個格子中有2或3個活著的細胞,則繼續存活;如果周圍8個格子中的活著的細胞數量少於2個或多於3個,則死亡;

  • 如果該細胞現在是死的,並且周圍8個格子中正好有3個活著的細胞,則細胞復活。

  • 位於整個網格邊緣和頂角的細胞,它的周圍細胞可能少於8個。即越過網格的邊界不再有細胞。

  • 每個細胞的生死變化,都不會影響當前這一步周圍的細胞,只會在下一步表現出來。

提示:課程中的代碼與上一句描述不同。

輸入格式:

首先輸入兩個正整數,範圍為[3,102],依次表示網格的寬度和高度。

然後輸入多組正整數,依次表示一個活著的細胞的網格位置,每組數字中,第一個表示行號,第二個表示列號,均從0開始編號。

最後,以“-1 -1”表示不再有活著的細胞。-1 -1不是有效的位置。

然後,以一個正整數,範圍為[1,10000],表示要求細胞自動機執行的步數。

輸出格式:

輸出一個正整數,表示執行完畢後,剩下的活著的細胞的數量。

輸入樣例:

3 3

1 1 1 2 0 1 2 1

-1 -1

1

輸出樣例:

7

時間限制:500ms內存限制:32000kb
import java.util.Scanner;

public class CellMachine {
	static Scanner in = new Scanner(System.in);
	static int width = 0;// 寬度
	static int height = 0;// 高度
	static int[][] field_old;// 舊的網格
	static int[][] field_new;// 新的網格
	static int times;// 步數

	public static void main(String[] args) {
		// 首先輸入兩個正整數,範圍為[3,102],依次表示網格的寬度和高度。
		width = in.nextInt();
		height = in.nextInt();

		// 初始化數組
		initial();

		// 然後,以一個正整數,範圍為[1,10000],表示要求細胞自動機執行的步數。
		times = in.nextInt();

		// 細胞自動機執行
		run(times);

		System.out.println(count(field_old));// 輸出一個正整數,表示執行完畢後,剩下的活著的細胞的數量。
	}

	// 初始化數組
	public static void initial() {
		field_old = new int[height][width];
		field_new = new int[height][width];

		for (int i = 0; i < field_old.length; i++) {
			for (int j = 0; j < field_old[i].length; j++) {
				field_old[i][j] = 0;
				field_new[i][j] = 0;
			}
		}

		// 然後輸入多組正整數,依次表示一個活著的細胞的網格位置,每組數字中,第一個表示行號,第二個表示列號,均從0開始編號。
		while (true) {
			int i = in.nextInt();
			int j = in.nextInt();

			if (i == -1 && j == -1) {
				break;// 最後,以“-1 -1”表示不再有活著的細胞。-1 -1不是有效的位置。
			}

			field_old[i][j] = 1;
			field_new[i][j] = 1;
		}
	}

	// 細胞自動機執行
	public static void run(int times) {
		int number = 0;

		for (int i = 0; i < times; i++) {
			for (int j = 0; j < field_old.length; j++) {
				for (int k = 0; k < field_old[j].length; k++) {
					number = getNeighbour(j, k);// 計算周圍活著的細胞

					if (field_old[j][k] == 1 && (number == 2 || number == 3)) {
						field_new[j][k] = 1;
					} else {
						field_new[j][k] = 0;
					}

					if (field_old[j][k] == 0 && number == 3) {
						field_new[j][k] = 1;
					}
				}
			}

			for (int j = 0; j < field_new.length; j++) {
				for (int k = 0; k < field_new[j].length; k++) {
					field_old[j][k] = field_new[j][k];// 把新的復制到舊的
				}
			}
		}
	}

	// 計算周圍活著的細胞
	public static int getNeighbour(int i, int j) {
		int number = 0;

		if (i == 0 && j == 0) {// 左上角
			number = field_old[i][j + 1] + field_old[i + 1][j + 1] + field_old[i + 1][j];
		} else if (i == 0 && j == width - 1) {// 右上角
			number = field_old[i][j - 1] + field_old[i + 1][j - 1] + field_old[i + 1][j];
		} else if (i == height - 1 && j == 0) {// 左下角
			number = field_old[i - 1][j] + field_old[i - 1][j + 1] + field_old[i][j + 1];
		} else if (i == height - 1 && j == width - 1) {// 右下角
			number = field_old[i - 1][j] + field_old[i - 1][j - 1] + field_old[i][j - 1];
		} else if (i == 0) {// 首行其他
			number = field_old[i][j - 1] + field_old[i + 1][j - 1] + field_old[i + 1][j] + field_old[i + 1][j + 1]
					+ field_old[i][j + 1];
		} else if (i == height - 1) {// 末行其他
			number = field_old[i][j - 1] + field_old[i - 1][j - 1] + field_old[i - 1][j] + field_old[i - 1][j + 1]
					+ field_old[i][j + 1];
		} else if (j == 0) {// 最左其他
			number = field_old[i - 1][j] + field_old[i - 1][j + 1] + field_old[i][j + 1] + field_old[i + 1][j + 1]
					+ field_old[i + 1][j];
		} else if (j == width - 1) {// 最右其他
			number = field_old[i - 1][j] + field_old[i - 1][j - 1] + field_old[i][j - 1] + field_old[i + 1][j - 1]
					+ field_old[i + 1][j];
		} else {// 其他
			number = field_old[i - 1][j - 1] + field_old[i - 1][j] + field_old[i - 1][j + 1] + field_old[i][j + 1]
					+ field_old[i + 1][j + 1] + field_old[i + 1][j] + field_old[i + 1][j - 1] + field_old[i][j - 1];
		}

		return number;
	}

	// 剩下的活著的細胞的數量
	public static int count(int[][] field) {
		int number = 0;

		for (int i = 0; i < field.length; i++) {
			for (int j = 0; j < field[i].length; j++) {
				if (field[i][j] == 1) {
					number++;
				}
			}
		}

		return number;
	}
}

中國MOOC_面向對象程序設計——Java語言_期末考試編程題_1細胞自動機