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 <iostream>

using namespace std;

int n;
int table[15][15];
bool used[100005];

int digit(int x)
{
  int a[5];
  for(int i = 3; i >= 0; i--){
    a[i] = x % 10;
    x /= 10;
  }
  int ret = 0;
  for(int i = 0; i < 4; i++){
    ret = table[ret][a[i]];
  }
  return ret;
}

int calc(int x){
  return table[digit(x/10)][x%10];
}

int trans(int x, int i)
{
  int a[5];
  for(int j = 4; j >= 0; j--){
    a[j] = x % 10;
    x /= 10;
  }
  swap(a[i], a[i+1]);

  int ret = 0;
  for(int j = 0; j < 5; j++){
    ret *= 10;
    ret += a[j];
  }
  return ret;
}

int change(int x, int I, int J)
{
  int a[5];
  for(int i = 4; i >= 0; i--){
    a[i] = x % 10;
    x /= 10;
  }
  if(a[I] == J) return -1;
  a[I] = J;

  int ret = 0;
  for(int i = 0; i < 5; i++){
    ret *= 10;
    ret += a[i];
  }
  return ret;
}

int main(void)
{
  for(int i = 0; i < 10; i++){
    for(int j = 0; j < 10; j++){
      cin >> table[i][j];
    }
  }

  int ans = 0;
  for(int i = 0; i < 10000; i++){
    int d = digit(i);
    int id = i * 10 + d;

    bool flag = false;
    for(int j = 0; j < 4; j++){
      int t = trans(id, j);
      if(id != t && calc(t) == 0) flag = true;
    }
    for(int j = 0; j < 5; j++){
      for(int k = 0; k < 10; k++){
        int c = change(id, j, k);
        if(c != -1 && calc(c) == 0) flag = true;
      }
    }
    if(flag) ans++;
  }

  /*for(int i = 0; i < 10000; i++){
    int d = digit(i);
    int id = i * 10 + d;
    used[id] = false;
  }*/
  /*for(int i = 0; i < 100000; i++){
    if(used[i]) cout << calc(i) << endl;
    if(used[i] && calc(i) == 0){
      ans++;
    }
  }*/


  cout << ans << endl;
  return 0;
}