プログラムデザイナミラー4ブロック
マジシャンです
問題は知ってる...
私たちがしなければならないのは、出力が2 x 2ブロックを何個削除したかです.
方法
どのように展開するかを見てみましょう.
1.x 2個のブロックを見つけて、これらのブロックの座標(左上隅、すなわち2個の象限座標)の値を返します.
2.ステップ1の座標値で2個のx 2個のブロックを除去し、同時に個数を計算する
3.スペースの上のブロックを下に移動
4.1~3回繰り返し
5.ステップ1で座標値を戻さない場合は、繰り返し終了
ハーモニーを直接開始
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct Mypair{int x,y;};
int times; // 제거되는 블록 개수가 담길 변수
//2x2 블록 찾아서 해당 좌표 리턴
vector<Mypair> findFourBlock(int a, int b, vector<string> &c){
vector <Mypair> axis;
for(int i = 0; i < a - 1; i++){
for(int j = 0; j < b - 1; j++){
if(c[i][j] != '#' && (c[i][j] == c[i][j+1]
&& c[i][j+1] == c[i+1][j+1] && c[i+1][j] == c[i+1][j+1])){
Mypair pos;
pos.x = i;
pos.y = j;
axis.push_back(pos);
}
}
}
return axis;
}
//2x2 블록들 제거!! 동시에 개수도 세준다
void deleteBlock(vector<string> &a, vector<Mypair> &b){
for(int i = 0; i < b.size(); i++){
if(a[b[i].x][b[i].y] != '#') {a[b[i].x][b[i].y] = '#'; times++;}
if(a[b[i].x][b[i].y+1] != '#') {a[b[i].x][b[i].y+1] = '#'; times++;}
if(a[b[i].x+1][b[i].y] != '#') {a[b[i].x+1][b[i].y] = '#'; times++;}
if(a[b[i].x+1][b[i].y+1] != '#') {a[b[i].x+1][b[i].y+1] = '#'; times++;}
}
}
//빈칸위의 블록들 아래로 내려주기
void cleanBlank(int a, int b, vector<string> &c){
for(int i = a-1; i > 0; i--){
for(int j = b-1; j >= 0; j--){
if(c[i][j] == '#'){
for(int k = i-1; k >= 0; k--){
if(c[k][j] != '#'){
swap(c[i][j],c[k][j]);
break;
}
}
}
}
}
}
int solution(int m, int n, vector<string> board) {
while(1){
vector<Mypair> blist = findFourBlock(m,n,board);
if(blist.size() == 0 ) break; //더 이상 반환해줄 좌표가 없다면 반복 끝
deleteBlock(board,blist);
cleanBlank(m,n,board);
}
return times;
}
これは普遍的な体現問題である.アルゴリズムが始まってからまだ1年も経っていないが.体現する
Reference
この問題について(プログラムデザイナミラー4ブロック), 我々は、より多くの情報をここで見つけました https://velog.io/@fufru/PRGRMSfriends4Blockテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol