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 <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int tab[10][10], ssn[10000], num[6];
void init () {
	for (int id = 0; id < 10000; id++) {
		for (int j = 4, tmpId = id; j >= 1; j--, tmpId /= 10)
			num[j] = tmpId % 10;
		for (int j = 1; j <= 4; j++)
			num[j] = tab[ num[j - 1] ][ num[j] ];
		ssn[id] = id * 10 + num[4];
	}
}
void change (int numOfSsn) {
	for (int j = 5; j >= 1; j--) {
		num[j] = numOfSsn % 10;
		numOfSsn /= 10;
	}
}
bool judge (int ssn) {
	for (int j = 1; j <= 5; j++) {
		for (int i = 0; i < 10; i++) {
			change(ssn);
			if (num[j] == i) continue;
			num[j] = i;
			for (int k = 1; k <= 5; k++)
				num[k] = tab[ num[k - 1] ][ num[k] ];
			if (num[5] == 0) return true;
		}
	}

	for (int j = 2; j <= 5; j++) {
		change(ssn);
		if (num[j - 1] == num[j])  continue;
		swap(num[j - 1], num[j]);
		for (int k = 1; k <= 5; k++)
			num[k] = tab[ num[k - 1] ][ num[k] ];
		if (num[5] == 0) return true;
	}
	return false;
}
int main()
{
	for (int i = 0; i < 10; i++)
		for (int j = 0; j < 10; j++)
			scanf("%d", &tab[i][j]);
	init();
	int ans = 0;
	for (int i = 0; i < 10000; i++)
		if (judge (ssn[i]))  ans++;
	printf("%d\n", ans);
	return 0;
}