[PS backjun-2.5]1018号:チェス盤を塗り直す
問題情報
白駿1018号-ショートカット
コメント
8×88\times88×チェスのすべての碁盤を8つの大きさのブロックで切り落とし、「W」と「B」の個数までフォークで数え、これらの値の中から最高値を選べばいいのです.
フォーク数の関数はcheckNum()関数で、以下のようになります.
int checkNum(char arr[][8]) {
int count = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if ((i + j) % 2 == 0) {
if (arr[i][j] != 'W') count++;
}
else {
if (arr[i][j] != 'B') count++;
}
}
}
return count;
}
ソースコード
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int checkNum(char arr[][8]) {
int count = 0;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if ((i + j) % 2 == 0) {
if (arr[i][j] != 'W') count++;
}
else {
if (arr[i][j] != 'B') count++;
}
}
}
return count;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int m, n;
cin >> n >> m;
char c;
char** arr = new char* [n];
for (int i = 0; i < n; i++) {
arr[i] = new char[m];
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> c;
arr[i][j] = c;
}
}
int min = 64;
int max = 0;
for (int i = 0; i < n-7; i++) {
for (int j = 0; j < m-7; j++) {
char temp[8][8];
for (int a = 0; a < 8; a++) {
for (int b = 0; b < 8; b++) {
temp[a][b] = arr[a + i][b + j];
}
}
int num = checkNum(temp);
min = min < num ? min : num;
max = max > num ? max : num;
}
}
cout <<( min > 64 - max ? 64 - max : min);
for (int i = 0; i < n; i++) {
delete[] arr[i];
}
delete[] arr;
}
Reference
この問題について([PS backjun-2.5]1018号:チェス盤を塗り直す), 我々は、より多くの情報をここで見つけました https://velog.io/@yjwon20/PSboj2-5テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol