プログラムデザイナミラー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年も経っていないが.
体現する