暴力解法!
这代码有点长。但思路很容易理解,根据题意,如何判断多少颗雷,是根据相邻八颗而定的,但是边界和顶点周围并没有八颗。怎么办呢?我想到的是将四个顶点单独处理,边界单独处理,剩下的就是中间的有相邻八颗的。
于是我开始写代码,但在写的过程中,我发现并没法像我想的那样简单分为三种,除了中间点外,边界和顶点每种都有四种情况,于是我便去看其他人的解法,发现他们也是发现没法全部用相邻,于是把数组上下左右各扩大一行,这样就保证所有位置都有八个相邻,后面判断雷也是if和for语句,所以我判定我的思路也可以写出来,但只是较为繁琐,于是可以看到我下面有许多if语句
需要注意的点:1.怎么计数,可以用for循环和中间变量递增就可以优化if过多的问题。
2.字符与数字的转换(可以看到我赋值给数组的时候加了48)
3.其他一些写了才会发现的错误(如中间点一开始忘记设两个中间变量了,直接用一个中间变量做了两次循环)
#include <stdio.h>
int main(){
int n,m;
scanf("%d %d",&n,&m);
getchar();
char a[n][m];
char b[n][m];
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
scanf("%c",&a[i][j]);
}
getchar();
}
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
int count = 0;
if(a[i][j] == '*'){
b[i][j] = '*';
}
else if(i == 0 && j == 0){
if(a[i][j+1] == '*'){
count++;
}
if(a[i+1][j] == '*'){
count++;
}
if(a[i+1][j+1] == '*'){
count++;
}
else{
}
b[i][j] = count+48;
}
else if(i == 0 && j== m-1){
if(a[i][j-1] == '*'){
count++;
}
if(a[i+1][j] == '*'){
count++;
}
if(a[i+1][j-1] == '*'){
count++;
}
else{
}
b[i][j] = count+48;
}
else if(i == n-1 && j == 0){
if(a[i][j+1] == '*'){
count++;
}
if(a[i-1][j] == '*'){
count++;
}
if(a[i-1][j+1] == '*'){
count++;
}
else{
}
b[i][j] = count+48;
}
else if(i == n-1 && j == m-1){
if(a[i][j-1] == '*'){
count++;
}
if(a[i-1][j] == '*'){
count++;
}
if(a[i-1][j-1] == '*'){
count++;
}
else{
}
b[i][j] = count+48;
}
else if(j == 0){
int temp = i;
for(int k = 0;k<3;k++){
if(a[temp-1][j+1] == '*'){
count++;
}
temp++;
}
if(a[i-1][j] == '*'){
count++;
}
if(a[i+1][j] == '*'){
count++;
}
b[i][j] = count+48;
}
else if(j == m-1){
int temp = i;
for(int k = 0;k<3;k++){
if(a[temp-1][j-1] == '*'){
count++;
}
temp++;
}
if(a[i-1][j] == '*'){
count++;
}
if(a[i+1][j] == '*'){
count++;
}
b[i][j] = count+48;
}
else if(i == 0){
int temp = j;
for(int k = 0;k<3;k++){
if(a[i+1][temp-1] == '*'){
count++;
}
temp++;
}
if(a[i][j-1] == '*'){
count++;
}
if(a[i][j+1] == '*'){
count++;
}
b[i][j] = count+48;
}
else if(i == n-1){
int temp = j;
for(int k = 0;k<3;k++){
if(a[i-1][temp-1] == '*'){
count++;
}
temp++;
}
if(a[i][j-1] == '*'){
count++;
}
if(a[i][j+1] == '*'){
count++;
}
b[i][j] = count+48;
}
else{
int temp1 = j;
int temp2 = j;
for(int k1 = 0;k1<3;k1++){
if(a[i-1][temp1-1] == '*'){
count++;
}
temp1++;
}
for(int k2 = 0;k2<3;k2++){
if(a[i+1][temp2-1] == '*'){
count++;
}
temp2++;
}
if(a[i][j-1] == '*'){
count++;
}
if(a[i][j+1] == '*'){
count++;
}
b[i][j] = count+48;
}
}
}
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
printf("%c",b[i][j]);
}
printf("\n");
}
return 0;
}



京公网安备 11010502036488号