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>
#include <string>
using namespace std;

int table[10][10];

bool check(string s){
    int row = 0;
    for (int i = 0; i < 5; i++) {
        row = table[row][s[i]-'0'];
    }
    return (row == 0 ? true : false);
}

void add_check_digit(string& s) {
    int row = 0;
    for (int i = 0; i < 4; i++) {
        row = table[row][s[i]-'0'];
    }
    s += row+'0';
}

int main(void) {

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

    int cnt = 0;
    for (int i = 0; i < 10000; i++) {
        bool flag = false;
        string s = to_string(i);
        s = string(4-s.size(), '0') + s;
        add_check_digit(s);

        for (int j = 0; j < 5; j++) {
            for (int k = 0; k < 10; k++) {
                string tmp = s;
                if (tmp[j]-'0' != k) {
                    tmp[j] = k+'0';
                    if (check(tmp)) flag = true;
                }
            }
        }
        if (flag) {
            cnt++;
            continue;
        }

        for (int j = 1; j < 5; j++) {
            if (s[j-1] != s[j]) {
                string tmp = s;
                tmp[j] = s[j-1];
                tmp[j-1] = s[j];
                if (check(tmp)) flag = true;
            }
        }
        if (flag) cnt++;
    }

    cout << cnt << endl;

    return 0;
}