• 扫雷的埋雷


    好奇,想用二维数组实现扫雷的埋雷和统计周围雷的数目,刚开始用一个二维数组(相对小的那个,后文称:小数组)保存数据,发现统计的时候边缘情况有点麻烦,就又定义了一个比原来列行都大2的二维数组(后文称:大数组)。把原来的保存的数据放到大数组中间,然后统计大数组,统计结果放回小数组。

    代码:

    #include<stdio.h>
    #include<time.h>
    #define ROW 16 
    #define COL 30 
    #define TROW 18
    #define TCOL 32
    #define MINE_NUM 99
    #define MINE_FLAG 9 
    
    void initMine(int rec[][COL],int m,int n);
    void initTmp(int rec[][TCOL],int m,int n);
    void showMine(int rec[][COL],int m,int n);
    void showTmp(int rec[][TCOL],int m,int n);
    void setMine(int rec[][COL],int recTmp[][TCOL],int m,int n);
    void sniffeMine(int rec[][COL],int recTmp[][TCOL],int m,int n);
    int  isMine(int rec[][TCOL],int m,int n);
    
    int main(){
      int mineRec[ROW][COL];
      int tmpRec[TROW][TCOL];
      initMine(mineRec,ROW,COL);
      initTmp(tmpRec,TROW,TCOL);
      setMine(mineRec,tmpRec,ROW,COL);
      sniffeMine(mineRec,tmpRec,ROW,COL);
      showMine(mineRec,ROW,COL);
    }
    
    /* ------- function defination --------------- */
    void initMine(int rec[][COL],int m,int n){
      int i,j;
      for(i=0;i<m;i++)
         for(j=0;j<n;j++)
           rec[i][j] = 0;
    }
    void initTmp(int rec[][TCOL],int m,int n){
      int i,j;
      for(i=0;i<m;i++)
         for(j=0;j<n;j++)
           rec[i][j] = 0;
    }
    
    void showMine(int rec[][COL],int m,int n){
       int i,j;
       for(i=0;i<m;i++){
         for(j=0;j<n;j++){
            printf("%d ",rec[i][j]);
         }
         printf("
    ");
       }
       printf("
    ");
    }
    void showTmp(int rec[][TCOL],int m,int n){
       int i,j;
       for(i=0;i<m;i++){
         for(j=0;j<n;j++){
            printf("%d ",rec[i][j]);
         }
         printf("
    ");
       }
       printf("
    ");
    }
    void setMine(int rec[][COL],int recTmp[][TCOL],int m,int n){
       srand((int)time(0));
       int mc = 0;
       while( mc < MINE_NUM){
         int row = rand()%m;
         int col = rand()%n;
         if( rec[row][col] != MINE_FLAG ){
            rec[row][col] = MINE_FLAG;
            recTmp[row+1][col+1] = MINE_FLAG;
            mc++;
         }
      }
    }
    
    void sniffeMine(int rec[][COL],int recTmp[][TCOL],int m,int n){
       int i,j,row,col;
       for(i=0;i<m;i++)
         for(j=0;j<n;j++)
            if( rec[i][j] != MINE_FLAG ){
               row = i+1;
               col = j+1;
               rec[i][j] = isMine(recTmp,row-1,col-1) +
                           isMine(recTmp,row-1,col)   +
                           isMine(recTmp,row-1,col+1) +
                           isMine(recTmp,row,col-1)   +
                           isMine(recTmp,row,col+1)   +
                           isMine(recTmp,row+1,col-1) +
                           isMine(recTmp,row+1,col)   +
                           isMine(recTmp,row+1,col+1);
            } 
    }
    
    int isMine(int rec[][TCOL],int m,int n){
       return rec[m][n] == MINE_FLAG ? 1:0;
    }

    运行结果( 9为雷,其它的为雷的数目):

  • 相关阅读:
    linux添加超级用户
    MongDB配置方法
    【bzoj5174】[Jsoi2013]哈利波特与死亡圣器 二分+树形dp
    【bzoj3560】DZY Loves Math V 欧拉函数
    【bzoj5157】[Tjoi2014]上升子序列 树状数组
    【uoj#317】[NOI2017]游戏 2-SAT
    【bzoj5146】有趣的概率 微积分
    【bzoj4695】最假女选手 线段树区间最值操作
    【bzoj4355】Play with sequence 线段树区间最值操作
    【loj2319】[NOIP2017]列队 Splay(卡过)
  • 原文地址:https://www.cnblogs.com/laoquans/p/3825605.html
Copyright © 2020-2023  润新知