[白俊]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で統一する
Reference
この問題について([白俊]1018チェス盤を塗り直す), 我々は、より多くの情報をここで見つけました
https://velog.io/@kpg0518/백준-1018-체스판-다시-칠하기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#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);
}
Reference
この問題について([白俊]1018チェス盤を塗り直す), 我々は、より多くの情報をここで見つけました https://velog.io/@kpg0518/백준-1018-체스판-다시-칠하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol