你知道窗户扫雷游戏吗好吧,下面的问题是相同的,你将输入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/