代码1:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main()
{
int d[102][102]={0};//用来存放整型的输出结果
int i,j,n,m;//n行m列,n行,每行m个字符
char a[102][102],flag[102][102];//用来存放字符型的输出结果
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>a[i][j];//问:为什么c++的输入语句时,换行就不算一个字符,但用scanf语句换行就算做一个字符输入
//scanf("%c",&a[i][j]);
}
}
for(i=0;i<n;i++)//遍历所输入的二维数组的每个字符,,是*就表示地雷格,不是*的非地雷格旧纪录周围地雷的个数
{
for(j=0;j<m;j++)
{
if(a[i][j]=='*')
d[i][j]=-1;//是地雷格,就把d数组对应位置记录成-1(记录成0会出现错误)
else
{//检测周围八个的地雷,注意这里八个位置的写法,8个if
if(a[i+1][j]=='*')
d[i][j]++;
if(a[i-1][j]=='*')
d[i][j]++;
if(a[i][j+1]=='*')
d[i][j]++;
if(a[i][j-1]=='*')
d[i][j]++;
if(a[i-1][j-1]=='*')
d[i][j]++;
if(a[i-1][j+1]=='*')
d[i][j]++;
if(a[i+1][j-1]=='*')
d[i][j]++;
if(a[i+1][j+1]=='*')
d[i][j]++;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(d[i][j]==-1)
flag[i][j]='*';
else
flag[i][j]=d[i][j]+'0';//把整型转为字符型例如整型1转换为字符'1'
printf("%c",flag[i][j]);
}
printf("\n");
}
return 0;
}
代码2:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main()
{
int n,m,i,j,sum=0;//sum用来记录周围的地雷数
char a[102][102];
char d[102][102];
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>a[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(a[i][j]=='*')
d[i][j]=a[i][j];//也可以直接printf("*");
else
{
sum=0;
if(a[i+1][j]=='*')
sum++;
if(a[i-1][j]=='*')
sum++;
if(a[i][j-1]=='*')
sum++;
if(a[i][j+1]=='*')
sum++;
if(a[i+1][j+1]=='*')
sum++;
if(a[i+1][j-1]=='*')
sum++;
if(a[i-1][j+1]=='*')
sum++;
if(a[i-1][j-1]=='*')
sum++;
d[i][j]=sum+'0';//或者直接printf("%c",sum+'0';
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
printf("%c",d[i][j]);
}
printf("\n");
}
return 0;
}
注意:
l 整型转换为字符型:+‘0’(把整型的1234转化为字符串“1234”)(还是记不住)
l 字符型转换成整型:-‘0’(把字符型的“1234”转化为整型1234)(还是记不住)
l 字符‘0’-‘9’转化成数字0~9就是:字符减去‘0’得到的就是数字的值
例如:字符‘1’是49,减去‘0’即减去48,就化成了1
l 注意这里:在记录这个位置上周围8个方向的地雷时的代码表示方式,不能用if(a[i][j+1]==‘*’ ||a[i][j-1]==‘*’)
这样表示。只要这8个方向中有一个方向上有地雷就++,代码如下:
l 一个毛病:学了后面的,忘了前面的!!!!!!!!!
问:
为什么c++的输入语句时,换行就不算一个字符,但用scanf语句换行就算做一个字符输入
例如:使用cin>>a[i][j];时,输入时换行就没有算做一个字符,如下图:
使用scanf(“%c”,&a[i][j]);时,输入时换行就被算做一个字符,如下图:
只输入了两行就不能输了…