sysugz


私信TA

用户名:qq512620936

访问量:15189

签 名:

学渣到此一游~

等  级
排  名 1662
经  验 2692
参赛次数 0
文章发表 16
年  龄 0
在职情况 学生
学  校 中山大学
专  业

  自我简介:

解题思路:遍历所有格子.把有雷的格子周围的空格计数+1.

代码:

#include <stdio.h>

#include <stdlib.h>


void MinesInCorner(char **,int,int);

void MinesInSide(char **,int,int);

void MinesInMiddle(char **,int,int);

void PrintfMines(char **,int,int);



int main()

{

    int M,N;

    int i,j;

    int fieldcount =0;

    char **mines = NULL;        //表示扫雷区域


    do{

        scanf("%d%d",&M,&N);

        getchar();

        if(M == 0)              //判断是否为结束标志

            break;

        fieldcount++;

        if(fieldcount > 1)

                printf("\n");


        mines = (char **)malloc(sizeof(char *) * M);

        for(i=0;i<M;i++)

            mines[i] = (char *)malloc(sizeof(char) * (N+1));


/*           读入雷区信息     */

        for(i=0;i<M;i++)

        {

            gets(mines[i]);

        }

/*         将非雷的方格置为0   */

        for(i=0;i<M;i++)

        {

            for(j=0;j<N;j++)

                if(mines[i][j] == '.')

                    mines[i][j] = '0';

        }

/*      统计每个方格附近的雷数     */

        if(M > 2 && N > 2)

        {

            MinesInCorner(mines,M,N);

            MinesInSide(mines,M,N);

            MinesInMiddle(mines,M,N);

        }else if( M == 2 && N == 2)

        {

            MinesInCorner(mines,M,N);

        }else if(M == 1 && N >= 2)

        {

            if(mines[0][0] == '*')

            {

                if(mines[0][1] != '*')

                    mines[0][1]++;

            }

            if(mines[0][N-1] == '*')

            {

                if(mines[0][N-2] != '*')

                    mines[0][N-2]++;

            }

                for(i=1;i<N-1;i++)

                {

                    if(mines[0][i] == '*')

                    {

                        if(mines[0][i-1] != '*')

                            mines[0][i-1]++;

                        if(mines[0][i+1] != '*')

                            mines[0][i+1]++;

                    }

                }

        }else if(M >= 2 && N == 1)

        {

            if(mines[0][0] == '*')

            {

                if(mines[1][0] != '*')

                    mines[1][0]++;

            }

            if(mines[M-1][0] == '*')

            {

                if(mines[M-2][0] != '*')

                    mines[M-2][0]++;

            }


                for(i=1;i<M-1;i++)

                {

                    if(mines[i][0] == '*')

                    {

                        if(mines[i-1][0] != '*')

                            mines[i-1][0]++;

                        if(mines[i+1][0] != '*')

                            mines[i+1][0]++;

                    }

                }

            }

/*      输出统计后的雷区信息       */

        printf("Field #%d:\n",fieldcount);

        PrintfMines(mines,M,N);


        for(i=0;i<M;i++)

            free(mines[i]);

        free(mines);


    }while(1);


    return 0;

}

/***************************************/

void MinesInCorner(char ** A,int M,int N)

{

/*      判断左上角     */

    if(A[0][0] == '*')

    {

            if(A[1][1] != '*')

                A[1][1]++;

            if(A[1][0] != '*')

                A[1][0]++;

            if(A[0][1] != '*')

                A[0][1]++;

    }

/*      判断左下角     */

    if(A[M-1][0] == '*')

    {

            if(A[M-2][0] != '*')

                A[M-2][0]++;

            if(A[M-1][1] != '*')

                A[M-1][1]++;

            if(A[M-2][1] != '*')

                A[M-2][1]++;

    }

/*      判断右上角     */

    if(A[0][N-1] == '*')

    {

            if(A[0][N-2] != '*')

                A[0][N-2]++;

            if(A[1][N-1] != '*')

                A[1][N-1]++;

            if(A[1][N-2] != '*')

                A[1][N-2]++;

    }

/*      判断右下角     */

    if(A[M-1][N-1] == '*')

    {

            if(A[M-1][N-2] != '*')

                A[M-1][N-2]++;

            if(A[M-2][N-1] != '*')

                A[M-2][N-1]++;

            if(A[M-2][N-2] != '*')

                A[M-2][N-2]++;

    }

}

/*******************************************/

void MinesInSide(char ** A,int M,int N)

{

    int i;

/*          判断上边                   */

    for(i=1;i<N-1;i++)

    {

        if(A[0][i] == '*')

        {

            if(A[0][i-1] != '*')

                A[0][i-1]++;

            if(A[0][i+1] != '*')

                A[0][i+1]++;

            if(A[1][i-1] != '*')

                A[1][i-1]++;

            if(A[1][i] != '*')

                A[1][i]++;

            if(A[1][i+1] != '*')

                A[1][i+1]++;

        }

    }

/*          判断下边                   */

    for(i=1;i<N-1;i++)

    {

        if(A[M-1][i] == '*')

        {

            if(A[M-1][i-1] != '*')

                A[M-1][i-1]++;

            if(A[M-1][i+1] != '*')

                A[M-1][i+1]++;

            if(A[M-2][i-1] != '*')

                A[M-2][i-1]++;

            if(A[M-2][i] != '*')

                A[M-2][i]++;

            if(A[M-2][i+1] != '*')

                A[M-2][i+1]++;

        }

    }

/*          判断左边                   */

    for(i=1;i<M-1;i++)

    {

        if(A[i][0] == '*')

        {

            if(A[i-1][0] != '*')

                A[i-1][0]++;

            if(A[i+1][0] != '*')

                A[i+1][0]++;

            if(A[i][1] != '*')

                A[i][1]++;

            if(A[i-1][1] != '*')

                A[i-1][1]++;

            if(A[i+1][1] != '*')

                A[i+1][1]++;

        }

    }

/*          判断右边                   */

    for(i=1;i<M-1;i++)

    {

        if(A[i][N-1] == '*')

        {

            if(A[i-1][N-1] != '*')

                A[i-1][N-1]++;

            if(A[i+1][N-1] != '*')

                A[i+1][N-1]++;

            if(A[i][N-2] != '*')

                A[i][N-2]++;

            if(A[i+1][N-2] != '*')

                A[i+1][N-2]++;

            if(A[i-1][N-2] != '*')

                A[i-1][N-2]++;

        }

    }

}

/*******************************************/

void MinesInMiddle(char ** A,int M,int N)

{

    int i,j;

    for(i=1;i<M-1;i++)

    {

        for(j=1;j<N-1;j++)

        {

            if(A[i][j] == '*')

            {

                if(A[i-1][j-1] != '*')

                    A[i-1][j-1]++;

                if(A[i-1][j] != '*')

                    A[i-1][j]++;

                if(A[i-1][j+1] != '*')

                    A[i-1][j+1]++;

                if(A[i][j-1] != '*')

                    A[i][j-1]++;

                if(A[i][j+1] != '*')

                    A[i][j+1]++;

                if(A[i+1][j-1] != '*')

                    A[i+1][j-1]++;

                if(A[i+1][j] != '*')

                    A[i+1][j]++;

                if(A[i+1][j+1] != '*')

                    A[i+1][j+1]++;

            }

        }

    }


}

/*******************************************/

void PrintfMines(char ** A,int M,int N)

{

    int i,j;

    for(i=0;i<M;i++)

    {

        for(j=0;j<N;j++)

        {

            printf("%c",A[i][j]);

        }

        printf("\n");

    }

}


 

0.0分

0 人评分

  评论区

不错不错,思路很好,就是算法应该能更加简洁吧。。。
2017-12-15 09:46:52
哈哈哈,简直就是一股清流
2017-11-27 21:08:29
  • «
  • 1
  • »