日々精進

aikoと旅行とプログラミング

【AOJ 1368】Quality of Check Digits

問題

Quality of Check Digits | Aizu Online Judge

方針

  • 4桁の数字(abcd)をループで作る.
  • eを求め, それをチェック関数に投げる.
  • abcdの各桁を0-9の数字で置き換え, 0になったら-1を返す.
  • また, 連続する2桁を交換し(ただし, それぞれが違う文字のときのみ)0になったら-1を返す
  • -1の数を数え, それが答えとなる.

コード

#include <iostream>

#define rep(i, n) REP(i, 0, n)
#define REP(i, a, n) for(int i = a ; i < (int)n ; i++)

using namespace std;

int table[10][10];

int check(int a, int b, int c, int d, int e){
  
  rep(i, 10){
    if(table[table[table[table[table[0][i]][b]][c]][d]][e] == 0 && i != a){
      return -1;
    }
  }

  rep(i, 10){
    if(table[table[table[table[table[0][a]][i]][c]][d]][e] == 0 && i != b){
      return -1;
    }
  }

  rep(i, 10){
    if(table[table[table[table[table[0][a]][b]][i]][d]][e] == 0 && i != c){
      return -1;
    }
  }

  rep(i, 10){
    if(table[table[table[table[table[0][a]][b]][c]][i]][e] == 0 && i != d){
      return -1;
    }
  }

  rep(i, 10){
    if(table[table[table[table[table[0][a]][b]][c]][d]][i] == 0 && i != e){
      return -1;
    }
  }
  
  if(table[table[table[table[table[0][b]][a]][c]][d]][e] == 0 && a != b) return -1;
  if(table[table[table[table[table[0][a]][c]][b]][d]][e] == 0 && b != c) return -1;
  if(table[table[table[table[table[0][a]][b]][d]][c]][e] == 0 && c != d) return -1;
  if(table[table[table[table[table[0][a]][b]][c]][e]][d] == 0 && d != e) return -1;
  
  return 1;
}

signed main(){
  
  // input
  rep(i, 10){
    rep(j, 10){
      cin >> table[i][j];
    }
  }
  
  // check
  int ans = 0;
  rep(i, 10){
    rep(j, 10){
      rep(k, 10){
    rep(l, 10){
      int e = table[table[table[table[0][i]][j]][k]][l];
      if(check(i, j, k, l, e) == -1) ans++;
    }
      }
    }
  }

  cout << ans << endl;
}