SRM 517 Div2 Easy MonochromaticBoard

マップ上の黒で塗るところと白で塗るところが与えられる.
縦一列,横一列を黒に塗る操作ができる時,マップで指定される黒塗りを行う最小手数を求めよという問題(初期状態は全部白).
面倒くさい方法で解いてしまったがもっと綺麗な解き方があった.
すべて黒で塗る行か列の回数を求め,足した数を返せば良い.
但し,すべての行と列を黒で塗る場合,2度塗りになるので行の個数と列の個数で小さい方を返す.

class MonochromaticBoard
{
public:
  int countr(vector<vector<bool> > & b, vector<vector<bool> > & b2){
    int ret = 0;
    for(int i = 0; i < b.size(); i++){
      int count = 0;
      for(int j = 0; j< b[i].size(); j++){
        if (b[i][j]) count++;
      }
      if (count == b[i].size()){
        ret++;
        for(int j = 0; j < b[i].size(); j++) b2[i][j] = false;
      }
    }
    return ret;
  }
  int countc(vector<vector<bool> > & b, vector<vector<bool> > & b2){
    int ret = 0;
    int i, j;
    for(j = 0; j < b[0].size(); j++){
      int count = 0;
      for(i = 0; i < b.size(); i++){
        if (b[i][j]) count++;
      }
      if (count == b.size()){
        ret++;
        for(int i = 0; i < b.size(); i++) b2[i][j] = false;
      }
    }
    return ret;
  }
  int theMin(vector <string> board)
    {
      int n = board.size();
      int m = board[0].size();
      int i, j;
      int ret = 0;
      vector<vector<bool> > b(n, vector<bool>(m));
      vector<vector<bool> > w(n, vector<bool>(m, false));
      for(i = 0; i < n; i++)
        for(j = 0; j < m; j++)
          if (board[i][j] == 'B'){
            b[i][j] = true;
          }else{
            b[i][j] = false;
          }
      vector<vector<bool> > b2 = b;
      if (n < m){
        ret += countr(b, b2);
        bool flag = false;
        for(i = 0; i < n; i++) for(j = 0; j < m; j++) if(b2[i][j]){
              flag = true;
              break;
            }
        if (flag){
          ret += countc(b, b2);
        }
      }else{
        ret += countc(b, b2);
        bool flag = false;
        for(i = 0; i < n; i++) for(j = 0; j < m; j++) if(b2[i][j]){
              flag = true;
              break;
            }
        if (flag){
          ret += countr(b, b2);
        }
      }
      return ret;
    }
};