[白俊]1018チェス盤を塗り直す


白準1018チェス盤を塗り直す


質問する


https://www.acmicpc.net/problem/1018

入力



しゅつりょく



トラブルシューティング方法


ブルートフォースで問題を解いてみます.
問題が示しているように、私たちがしなければならないチェス盤は2つの場合の数しか存在しません.
8 x 8の場合、一番左上のセルは白と黒です.
この2つのケースを事前に2次元配列を用いて作成し,入力した碁盤を上から下へ,右から順に8×8マスに切り,作成した碁盤と比較して最小値を見つけた.

コード実装(C++)

#include <iostream>
#include <string>

using namespace std;


string black[8] = {
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB"
};
string white[8] = {
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW",
    "WBWBWBWB",
    "BWBWBWBW"
};
string chess[50];
int black_check(int x,int y){
    int diff = 0;
    for(int i = x; i < x + 8; i++){
        for(int j = y; j < y + 8; j++){
            if(chess[i][j] != black[i-x][j-y]) diff++;
        }
    }
    return diff;
}
int white_check(int x,int y){
    int diff = 0;
    for(int i = x; i < x + 8; i++){
        for(int j = y; j < y + 8; j++){
            if(chess[i][j] != white[i-x][j-y]) diff++;
        }
    }
    return diff;
}
int main(){
    int min = 1000000;
    int row,col;
    scanf("%d %d",&row,&col);
    for(int i = 0; i < row; i++){
        cin >>chess[i];
    }
    for(int i = 0; i <= row - 8; i++){
        for(int j = 0; j <= col - 8; j++){
            int black_num = black_check(i,j);
            int white_num = white_check(i,j);
            if(min > black_num) min = black_num;
            if(min > white_num) min = white_num; 
        }
    }
    printf("%d\n",min);
}

評価


問題の正確な理解がなく、入出力や例題だけを見て、すぐに解く習慣があると、かえって簡単な問題に時間を費やすことになります.今後,問題を十分に理解し,アルゴリズムを作成し,コードを実現する習慣を身につけなければならない.今回は和弦がきれいに編まれていて気持ちが良かったです
できるだけmainでは簡単な機能しか実現しませんが、1つの機能では1つの機能しか実現しません.
入力もcinかscanfで統一する