Problem: Example

Input

0 3 1 7 5 9 8 6 4 2
7 0 9 2 1 5 4 8 6 3
4 2 0 6 8 7 1 3 5 9
1 7 5 0 9 8 3 4 2 6
6 1 2 3 0 4 5 9 7 8
3 6 7 4 2 0 9 5 8 1
5 8 6 9 7 2 0 1 3 4
8 9 4 5 3 6 2 0 1 7
9 4 3 8 6 1 7 2 0 5
2 5 8 1 4 3 6 7 9 0


Output

0

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;

const int S = 4;
int operation_table[10][10];

int check_digit(const char* s) {
  int r = 0;
  for (int i = 0; i < S; i++) {
    r = operation_table[r][s[i] - '0'];
  }
  return r;
}

bool correct(const char* s) {
  int e = check_digit(s);
  return operation_table[e][s[S] - '0'] == 0;
}

int main() {
  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
      scanf("%d", operation_table[i] + j);
    }
  }
  int cnt = 0;
  for (int n = 0; n < 10000; n++) {
    char s[5];
    sprintf(s, "%04d", n);
    s[S] = check_digit(s) + '0';
    bool ng = [&]() {
      for (int i = 0; i < S; i++) {
        if (s[i] == s[i + 1]) continue;
        swap(s[i], s[i + 1]);
        if (correct(s)) return true;
        swap(s[i], s[i + 1]);
      }
      for (int i = 0; i < S + 1; i++) {
        for (char j = '0'; j <= '9'; j++) {
          if (s[i] == j) continue;
          swap(s[i], j);
          if (correct(s)) return true;
          swap(s[i], j);
        }
      }
      return false;
    }();
    if (ng) cnt++;
  }
  printf("%d\n", cnt);
}