【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; }