Submission #2866076


Source Code Expand

// header file
#include <iostream>
#include <cstdio>
#include <vector>  //vector<T> vec; ランダムアクセスが速い、挿入は線形時間
#include <list>  //list<T> ls; 挿入・消去速い、アクセスは線形時間
#include <algorithm>
#include <functional> // greater<int>()を使える
#include <utility>
#include <string>
#include <map>
// macro
#define REP(i, n) for (int i=0; i < (int)(n); i++)  // 0 ~ n-1
#define REPN(i, n) for (int i=1; i <= (int)(n); i++)  // 1 ~ n
#define R_REP(i, n) for(int i = ((int)(n - 1)); i >= 0; i--)  // Reverse n-1 ~ 0
#define R_REPN(i, n) for(int i= ((int)(n));i > 0;i--)  // Reverse n ~ 1
#define FOR(i, m, n) for(int i = m;i < n;i++)  // 指定範囲loop m ~ n-1
#define pb(vec) push_back(vec)  // 配列の一番うしろに追加
// typedef
typedef long long ll;  // int64

using namespace std;

// prototype declaration
void stdout_matrix(int, int, vector< vector<int> >);
vector< vector<int> > minesweeper(int, int, vector< vector<int> >);

int main(void) {
    int H, W;  // row:H, column:W
    cin >> H >> W;

    // 各マス目の文字列の取得
    string S_i;
    vector< vector<int> > S_int(H, vector<int>(W));  // H行 W列

    REP(i, H) {
        std::cin >> S_i;
        REP(j, W) {
            //DEBUG REP(j, W) std::cout << S_i[j] << std::endl;
            if (S_i[j] == '.') {  // 単一文字のため single quotation を使う
                // 入力した文字の変換 .=0, #(bomb)=1
                S_int[i][j] = 0;
            } else {
                S_int[i][j] = 1;
            }
        }
    }
    //DEBUG stdout_matrix(H, W, S_int);
    // ここまでで爆弾の数値行列の完成

    // 爆弾の数計算
    vector< vector<int> > mineMatrix(H, vector<int>(W));  // H行 W列
    mineMatrix = minesweeper(H, W, S_int);
    //OKだった stdout_matrix(H, W, mineMatrix);

    REP(i, H) {
        REP(j, W) {
            if (mineMatrix[i][j] == 9) {
                std::cout << "#";
            } else {
                std::cout << mineMatrix[i][j];
            }
        }
        std::cout << std::endl;
    }

    return 0;
}

// 周囲8マスの爆弾数を返す
vector< vector<int> > minesweeper(int H,int W, vector< vector<int> > Matrix) {
    vector< vector<int> > mineMatrix(H, vector<int>(W));  // H行 W列
    //  行数:H, 列数:W
    REP(i, H) {
        REP(j, W) {
            // 爆弾ではない時
            if (Matrix[i][j] == 0) {
                if (i == 0) {  // 0行
                    if(j == 0) {  // 最初の行 左上
                        mineMatrix[i][j] = Matrix[0][1] + Matrix[1][0] + Matrix[1][1];
                    } else if (j == W - 1) {  // 最初の行 右上
                        mineMatrix[i][j] = Matrix[i][j-1] + Matrix[i+1][j-1] + Matrix[i+1][j];
                    } else {  // 周囲が 下5マス
                        mineMatrix[i][j] = Matrix[i][j-1] + Matrix[i][j+1] + Matrix[i+1][j-1] + Matrix[i+1][j] + Matrix[i+1][j+1];
                    }
                } else if (i == H - 1) {  // 第 H 行
                    if(j == 0) {  // 最後の行 左下
                        mineMatrix[i][j] = Matrix[i-1][0] + Matrix[i-1][1] + Matrix[i][1];
                    } else if (j == W - 1) {  // 最後の行 右下
                        mineMatrix[i][j] = Matrix[i][j-1] + Matrix[i-1][j-1] + Matrix[i-1][j];
                    } else {  // 周囲が 上5マス
                        mineMatrix[i][j] = Matrix[i][j-1] + Matrix[i][j+1] + Matrix[i-1][j-1] + Matrix[i-1][j] + Matrix[i-1][j+1];
                    }
                } else if (j == 0) {  // 周囲が 右5マス
                    mineMatrix[i][j] = Matrix[i-1][j] + Matrix[i+1][j] + Matrix[i-1][j+1] + Matrix[i][j+1] + Matrix[i+1][j+1];
                } else if (j == W - 1) {  // 周囲が 左5マス
                    mineMatrix[i][j] = Matrix[i-1][j] + Matrix[i+1][j] + Matrix[i-1][j-1] + Matrix[i][j-1] + Matrix[i+1][j-1];
                } else {  // その他周りが8マス
                    mineMatrix[i][j] = Matrix[i][j-1] + Matrix[i][j+1] \
                                    + Matrix[i-1][j-1] + Matrix[i-1][j] + Matrix[i-1][j+1] \
                                    + Matrix[i+1][j-1] + Matrix[i+1][j] + Matrix[i+1][j+1];
                }
            // 爆弾の時
            } else {
                mineMatrix[i][j] = 9;
            }
        }
    }
    return mineMatrix;
}

void stdout_matrix(int N, int M, vector< vector<int> > Matrix) {
    REP(i, N) {
            REP(j, M){
                std::cout << Matrix[i][j] << " ";
            }
            std::cout << std::endl;
    }
}

Submission Info

Submission Time
Task B - Minesweeper
User nukopy
Language C++14 (GCC 5.4.1)
Score 0
Code Size 4769 Byte
Status RE
Exec Time 98 ms
Memory 256 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 0 / 200
Status
AC × 3
AC × 12
WA × 1
RE × 2
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_2.txt, subtask_1_3.txt, subtask_1_4.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt
Case Name Status Exec Time Memory
sample_01.txt AC 1 ms 256 KB
sample_02.txt AC 1 ms 256 KB
sample_03.txt AC 1 ms 256 KB
subtask_1_1.txt AC 2 ms 256 KB
subtask_1_10.txt AC 2 ms 256 KB
subtask_1_11.txt AC 1 ms 256 KB
subtask_1_12.txt AC 1 ms 256 KB
subtask_1_2.txt AC 1 ms 256 KB
subtask_1_3.txt AC 1 ms 256 KB
subtask_1_4.txt RE 98 ms 256 KB
subtask_1_5.txt WA 1 ms 256 KB
subtask_1_6.txt AC 1 ms 256 KB
subtask_1_7.txt AC 1 ms 256 KB
subtask_1_8.txt AC 1 ms 256 KB
subtask_1_9.txt RE 98 ms 256 KB