• Algorithm Gossip(10) 细胞生命游戏


    前言

    This Series aritcles are all based on the book 《经典算法大全》; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行实现; 目的是熟悉常用算法过程中的技巧和逻辑拓展。

    提出问题

    Algorithm Gossip: 生命游戏

    说明

    生命游戏(game of life ) 为1970年由英国数学家J. H. Conway所提出,某一细胞的邻居包
    括上、下、左、右、左上、左下、右上与右下相邻之细胞,游戏规则如下:
    孤单死亡:如果细胞的邻居小于一个,则该细胞在下一次状态将死亡。
    拥挤死亡:如果细胞的邻居在四个以上,则该细胞在下一次状态将死亡。
    稳定:如果细胞的邻居为二个或三个,则下一次状态为稳定存活。
    复活:如果某位置原无细胞存活,而该位置的邻居为三个,则该位置将复活一细胞。
    解法 生命游戏的规则可简化为以下,并使用CASE比对即可使用程式实作:
    邻居个数为0、1、4、5、6、7、8时,则该细胞下次状态为死亡。
    邻居个数为2时,则该细胞下次状态为复活。
    邻居个数为3时,则该细胞下次状态为稳定。

    代码

    c语言实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #define MAXROW 10
    #define MAXCOL 25
    #define DEAD 0
    #defineALIVE 1
    int map[MAXROW][MAXCOL],newmap[MAXROW][MAXCOL];
    void init();
    int neighbors(int,int);
    void outputMap();
    void copyMap();
    int main() {
        int row, col;
        char ans;
        init();
        while(1) {
            outputMap();
            for(row = 0; row < MAXROW; row++) {
                for(col = 0; col < MAXCOL; col++) {
                    switch (neighbors(row,col)) {
                        case 0:
                        case 1:
                        case 4:
                        case 5:
                        case 6:
                        case 7:
                        case 8:
                        newmap[row][col] = DEAD;
                        break;
                        case 2:
                        newmap[row][col] = map[row][col];
                        break;
                        case 3:
                        newmap[row][col] =ALIVE;
                        break;
                        }
                    }
                }
            copyMap();
            printf("
    Continue next Generation ? ");
            getchar();
            ans = toupper(getchar());
            if(ans != 'Y') break;
            }
        return 0;
        }
    void init() {
        int row, col;
        for(row = 0; row < MAXROW;row++)
            for(col = 0; col < MAXCOL;col++)
            map[row][col] = DEAD;
        puts("Game of life Program");
        puts("Enter x, y where x, y is living cell");
        printf("0 <= x <= %d,0 <= y <= %d
    ",
        MAXROW-1,MAXCOL-1);
        puts("Terminate with x, y = -1, -1");
        while(1) {
            scanf("%d %d",&row,&col);
            if(0 <= row && row < MAXROW &&
            0 <= col && col < MAXCOL)
                map[row][col] =ALIVE;
            else if(row == -1 || col == -1)
                break;
            else
            printf("(x, y) exceeds map ranage!");
            }
        }
    int neighbors(int row, int col) {
        int count = 0, c, r;
        for(r = row-1; r <= row+1;r++)
            for(c = col-1;c <= col+1;c++) {
            if(r < 0 || r >= MAXROW || c < 0 || c >= MAXCOL)
                continue;
            if(map[r][c] ==ALIVE)
                count++;
            }
        if(map[row][col] ==ALIVE)
            count--;
        return count;
        }
    void outputMap(){
        int row, col;
        printf("
    
    %20cGame of life cell status
    ");
        for(row = 0; row < MAXROW;row++) {
            printf("
    %20c", ' ');
            for(col = 0; col < MAXCOL;col++)
                if(map[row][col] ==ALIVE) putchar('#');
            else putchar('-');
            }
        }
    void copyMap(){
        int row, col;
        for(row = 0; row < MAXROW;row++)
            for(col = 0; col < MAXCOL;col++)
            map[row][col] = newmap[row][col];
        }

    拓展和关联

    后记

    参考书籍

    • 《经典算法大全》
    • 维基百科
  • 相关阅读:
    服务端实现url网页截屏、HTML保存为高质量PDF[puppeteer]
    网页保存为图片[rasterizeHTML]
    SortedList<T,K>,SortedDictionary<T,K>,Dictionay<T,K>用法区别
    svn实现类似git stash及git stash pop的功能
    MSBuild报错及找不到AxImp.exe或LC.exe问题
    记一个ios下text-overflow: ellipsis 与 text-align: justify 冲突的问题
    Chrome devtools inspect后打开空白解决办法
    Oracle长时间使用导致连接变慢且频繁报无法找到监听程序的错误
    vscode+vue不得不用的插件和不得不添加的配置
    初识vscode+vue
  • 原文地址:https://www.cnblogs.com/actanble/p/6713406.html
Copyright © 2020-2023  润新知