你知道窗户扫雷游戏吗好吧,下面的问题是相同的,你将输入m和n…

0 < n,m <= 100
n : colons , m : rows

输入:
4 4
*...
....
.*..
....

输出:
*100
2210
1*10
1110

这是我的密码。
#include <stdio.h>
#include <stdlib.h>
char ms[100][101] ;
int m , n;
void input(){
    for(int r = 0 ; r < m ; r++)
        for(int c = 0 ; c <= n ; c++){
            scanf("%c",&ms[r][c]);
            if('.' == ms[r][c])
                ms[r][c] += 2 ;
        }
}
void calc(int m , int n){
    for(int r = m ; r <= (m+2) ; r++)
        for(int c = n ; c <= (n+2) ; c++)
            if(r >= 0 && c >= 0 && ms[r][c] != '*')
                ms[r][c] += 1 ;

}
void solve(){
    for(int r = 0 ; r < m ; r++)
        for(int c = 0 ; c < n ; c++)
            if( '*' == ms[r][c])
                calc(r-1 , c-1);
}
void output(){
    for(int r = 0 ; r < m ; r++)
        for(int c = 0 ; c <= n ; c++)
            printf("%c ", ms[r][c]);
}
int main()
{

    scanf("%d%d" , &m , &n);
    input();
    solve();
    output();

    return 0;
}

当运行我的代码时,如果输入第一个有*如下:
4 4
*...
....
.*..
....

输出为:
important to see it .. click here
注意:我试图打印图片中出现的符号的值,它是11的ascii码,这是垂直制表符。
另外,如果*在最后,另一个问题是:
4 4
...*
....
....
...*

000*
0000
0000
000*

但当*位于中间时,我的代码工作得很好,如下所示:
4 4
....
..*.
.*..
....

0111
12*1
1*21
1110

那么,我的代码有什么问题?

最佳答案

scanf("%d", ...);

在输入缓冲区中保留空白(回车)。那么
scanf("%c", ...);

将空白读入变量。
在读取星点之前(和期间)需要忽略空白。
使用
scanf(" %c", ...);
//    ^^^ ignore whitespace

注意:转换说明符"%d"(和许多其他说明符)已经包含忽略空白;异常是"%c""%["和[出于不同原因]"%n"

关于c - 扫雷游戏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35584981/

10-13 05:30