你知道窗户的扫雷游戏吗。下面的问题是一样的,你会输入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
*...
....
.*..
....输出是:重要的是看到它..。单击此处注释:我试图打印图片中显示的符号的值,在ascii代码中是11,这是垂直选项卡。
另外,如果*最后是这样的话,还有一个问题:
4 4
...*
....
....
...*
000*
0000
0000
000*但是,当*位于中间时,我的代码工作得很好,如下所示:
4 4
....
..*.
.*..
....
0111
12*1
1*21
1110那么,我的代码有什么问题?
发布于 2016-02-23 18:18:37
scanf("%d", ...);在输入缓冲区中留下空格( ENTER)。然后
scanf("%c", ...);将空格读入变量中。
在读星星和点之前,你需要忽略空格。
使用
scanf(" %c", ...);
// ^^^ ignore whitespace注意:转换说明符"%d" (和其他许多)已经包括忽略空格;例外是"%c"__、"%["__,以及出于不同原因的"%n"__)。
发布于 2016-02-23 18:18:46
在这一行中,您可以越界:
if(r >= 0 && c >= 0 && ms[r][c] != '*')
ms[r][c] += 1 ;您只测试r和c不是负的,但也应该测试它们不太大。
事情变得更加复杂,因为您有全局变量m和n,它们是数组的维度,但是它们在calc函数中是不可用的,因为这里有同名的局部变量。
所以你最好用不同的变量名。然后,您应该测试r<m和c<n,如下所示:
void calc(int p , int q){
for(int r = p ; r <= (p+2) ; r++)
for(int c = q ; c <= (q+2) ; c++)
if(r >= 0 && c >= 0 && r < m && c < n && ms[r][c] != '*')
ms[r][c] += 1 ;
}现在,您看到ASCII 11的原因是,ASCII 10是标记行尾的行提要字符。然后,当您的代码在其上执行ms[r][c] += 1 (因为它走得太远)时,它就变成了一个有趣的角色。
数组中有ASCII 10的原因是如何读取输入(请参阅@pmg的答案)。如果您没有读取这些空白字符,则仍然会发生溢出,并且可能会触摸下一行数据中的数据,这不是您希望发生的情况。
https://stackoverflow.com/questions/35584981
复制相似问题