行路756 2023-10-25 17:22 采纳率: 0%
浏览 6

C++模拟扫雷问题出错

原本是如果a[n][m]为就直接输出,不为就输出周围*的数量(参考扫雷)。我在程序中对改过程进行了模拟,但个别位置探测显示的雷数会出现变多的现象。

#include <bits/stdc++.h>using namespace std;
int main(){
 int n, m;    int i;    int j;   
 int sum = 0;   
 cout << "请输入n和m" << endl;   
 cin >> n >> m;   
 char a[n-1][m-1];  
  for( i = 0; i < n; ++i){  
      for( j = 0;j < m;++j){    
        cout << "请输入"<< endl;
             cin >> a[i][j];        }    } 
   cout <<"**************************"<<endl;
     for( i = 0; i < n; ++i){  
      for( j = 0;j < m;++j){  
          if(a[i][j] == '*')  
          cout <<"*"<< " ";
            else{ 
               if(a[i][j+1] == '*' )
                ++sum;   
             if(a[i+1][j] == '*' ) 
               ++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;   
             if(a[i][j-1] == '*' )  
              ++sum;  
              if(a[i-1][j] == '*' ){
                ++sum;    
            } 
               cout << sum <<" "; 
               sum = 0;
          }  
      } 
       cout << endl;
    }     return 0;}"
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-25 21:15
    关注

    【以下回答由 GPT 生成】

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int n, m;
        int i, j;
    
        cout << "请输入n和m:" << endl;
        cin >> n >> m;
    
        vector<vector<char>> a(n, vector<char>(m));
    
        for(i = 0; i < n; ++i) {  
            for(j = 0; j < m; ++j) {    
                cout << "请输入:" << endl;
                cin >> a[i][j];
            }
        }
    
        cout << "**************************" << endl;
    
        for(i = 0; i < n; ++i) {  
            for(j = 0; j < m; ++j) {  
                if(a[i][j] == '*') {
                    cout << "*" << " ";
                    continue;
                }
    
                int sum = 0;
                for(int di = -1; di <= 1; ++di) {
                    for(int dj = -1; dj <= 1; ++dj) {
                        int ni = i + di;
                        int nj = j + dj;
                        if(ni >= 0 && ni < n && nj >= 0 && nj < m && a[ni][nj] == '*') {
                            ++sum;
                        }
                    }
                }
                cout << sum << " ";
            } 
            cout << endl;
        }   
    
        return 0;
    }
    

    修改后的代码主要做了以下几个方面的改进:

    1. 使用动态数组vector来存储二维数组a,避免了原代码中的固定数组大小问题;
    2. 在遇到字符''时,直接输出"",而不计算周围雷的数量;
    3. 在遇到其他字符时,通过双重循环遍历周围的8个位置,判断是否为雷,如果是则累加雷的数量;
    4. 定义sum变量的位置进行了调整,在每次判断周围雷的数量之前,都将sum重新置为0,避免累加错误。

    这样修改后的代码应该可以正常输出每个位置周围的雷的数量,并解决原代码中出现雷数变多的问题。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 修改了问题 10月25日
  • 创建了问题 10月25日

悬赏问题

  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错
  • ¥15 拓扑学,凸集,紧集。。
  • ¥15 如何扩大AIS数据容量