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 <string>
#include <set>
#include <cstdio>
#include <algorithm>
using namespace std;
const int M=4;
int m[10][10];
char s0[M+2];
int chk(const string &s){
	int d=0;
	for(int i=0;i<4;i++)d=m[d][s[i]-'0'];
	return d;
}
bool correct(const string &s){
	return m[chk(s)][s[M]-'0']==0;
}
int main(){
	set<string>se;
	for(int i=0;i<10;i++)for(int j=0;j<10;j++)scanf("%d",m[i]+j);
	for(int i=0;i<10000;i++){
		sprintf(s0,"%04d",i);
		string s=s0;
		s+=chk(s)+'0';
		se.insert(s);
	}
	printf("%d\n",count_if(se.begin(),se.end(),[&](string s)->bool{
		for(int i=0;i<M;i++)if(s[i]!=s[i+1]){
			swap(s[i],s[i+1]);
			if(correct(s))return true;
			swap(s[i],s[i+1]);
		}
		for(int i=0;i<=M;i++)for(int j='0';j<='9';j++)if(s[i]!=j){
			string t=s;
			t[i]=j;
			if(correct(t))return true;
		}
		return false;
	}));
}