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


リンク:https://www.acmicpc.net/problem/1018
2 D配列の初期化方法がわかりません.1次元配列の初期化のように、= { 'W' }も問題ありません.like char arr [50][50]={ 'W' };チェス盤なので、上りと列を足した値が偶数と奇数で繰り返されることを忘れずに.
資料構造の課題をするときもいつも大変ですが、二次元文字の並べ替えの比較が一番難しいです.
受信文字
  • をintとして保存する比較(Askyコード:https://kd3302.tistory.com/668参照)
  • strcmp
  • を使用
    #include<iostream>
    using namespace std;
    
    int main() {
        int m,n;	//m 가로 n 세로
        cin >> n >> m;
    
        int arr[50][50]={ 0 };	//배열 초기화하기
        char num;
    
        for (int i = 0; i < n; i++) {	//입력된 배열을 arr 배열에 넣어주기
            for (int j = 0; j < m; j++) {
                cin >> num;
                arr[i][j] = num;
            }
        }
    
        int min = 50;	//최종 결과값인 min값 초기화
    
        for (int i = 0; i < n - 7; i++) {	
            for (int j = 0; j < m - 7; j++) {
    
                int wtob = 0;
                int btow = 0;
    
                for (int a = i; a < i + 8; a++) {
                    for (int b = j; b < j + 8; b++) {
    
                        if ((a + b) % 2 == 0) {
                            if (arr[a][b] == 66) 
                                btow++;
                            else
                                wtob++;
                        }
                        else {
                            if (arr[a][b] == 66)
                                wtob++;
                            else
                                btow++;
                        }
                    }
                }            
                min = (min < wtob) ? min : wtob;	//한번 싹 다 돌고 나서 최솟값 검색
                min = (min < btow) ? min : btow;
    
            }
        }
    
        cout << min;	//결과 출력
        return 0;
    }
    今回のアルゴリズムはすぐには考えにくいが,主な特徴は行と列に値を加えた値がずっと単重であることである.
     for (int i = 0; i < n - 7; i++) {
     	for (int j = 0; j < m - 7; j++) { 
    このように7を取り除くと,8×8の大きさで与えられた値を探索することができる.
    int wtob = 0;
    int btow = 0; 
    1つのブロック単位でナビゲーションを行う場合は、ナビゲーションを開始する前にwtob(bはwの部分であるべき)、btow(bはwの部分であるべき)を初期化し、変更する最小値を一定に保つことができます.
    for (int a = i; a < i + 8; a++) {
    	for (int b = j; b < j + 8; b++) { 
    町内を探索する.
    if ((a + b) % 2 == 0) {
      	if (arr[a][b] == 66)
      		btow++;                         
      	else
      		wtob++;
    } 
    まず行と列を加算し,偶数が現れる場合を探索する.その部分が66,Bであればbtowを1つ増やし,そうでなければwtobを1つ増やします.
    else { 
    	if (arr[a][b] == 66) 
    		wtob++; 
    	else 
    		btow++; 
    } 
    行と列を追加する値が奇数の場合.その結果,開始がwであれば,b日とw日に分ける必要はない.wから基準値をwに設定して比較を開始すると、確認した部分がbであればbtow値は増加し続けます.逆にwtobは全く増加していないため、リンゴを結ぶminはwtobとbtowの中で最も高い価格になるだろう.
    min = (min < wtob) ? min : wtob; 
    min = (min < btow) ? min : btow; 
    最終的にmin,wtob,btowで三重演算項により最高値を探し出す.