白駿1018


白准1018:重新涂上棋盘。


  • あらかじめ2つのボードを入力:Wから始まるボードとBから始まるボード

  • 入力された配列を8 X 8にカットし,最初のチェス盤と比較した.

  • 各色ごとにcountを行い、最小の場合に出力します.
  • 正しいコード
    #include <iostream>
    
    using namespace std;
    
    int N, M;
    string in[51], cand[51];
    int ans=2500;
    
    int intoBW(string bw[8], string in[50]) {
    	int count=0;
    	
    	for(int i=0; i<8; i++) {
    		for(int j=0; j<8; j++) {
    			if(bw[i][j] != in[i][j]) {
    				count++;
    			}
    		}
    	}
    	
    	return count;
    }
    
    int intoWB(string wb[8], string in[50]) {
    	int count=0;
    	
    	for(int i=0; i<8; i++) {
    		for(int j=0; j<8; j++) {
    			if(wb[i][j] != in[i][j]) {
    				count++;
    			}
    		}
    	}
    	
    	return count;
    }
    
    int main() {
    	ios_base::sync_with_stdio(false);
    	cin.tie(NULL);
    	cout.tie(NULL);
    	
    	string bw[8] =  {
    		"BWBWBWBWBW",
    		"WBWBWBWBWB",
    		"BWBWBWBWBW",
    		"WBWBWBWBWB",
    		"BWBWBWBWBW",
    		"WBWBWBWBWB",
    		"BWBWBWBWBW",
    		"WBWBWBWBWB"		
    	};
    	
    	string wb[8] = {
    		"WBWBWBWBWB",
    		"BWBWBWBWBW",
    		"WBWBWBWBWB",
    		"BWBWBWBWBW",
    		"WBWBWBWBWB",
    		"BWBWBWBWBW",
    		"WBWBWBWBWB",
    		"BWBWBWBWBW"
    	};
    	
    	
    	cin>>N>>M;
    	
    	for(int i=0; i<=N; i++) {
    		getline(cin, in[i]);
    	}
    	
    	for(int i=0; i<=N-8; i++) {
    		for(int j=0; j<=M-8; j++) {
    			for(int k=0; k<8; k++) {
    				cand[k] = in[i+k+1].substr(j, j+8);
    			}
    			
    			int a=intoBW(bw, cand);
    			int b=intoWB(wb, cand);
    			
    			if(min(a, b) < ans) {
    				ans = min(a, b);
    			}
    		}
    	}
    	
    	
    	cout<<ans<<"\n";
    	
    	
    	return 0;
    }