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;

int t[10][10];

int getdigit(int number){
	int a=number/1000;
	int b=(number%1000)/100;
	int c=(number%100)/10;
	int d=number%10;
	return (t[t[t[t[0][a]][b]][c]][d]);
}

int getdigit(int a,int b,int c,int d){
	return (t[t[t[t[0][a]][b]][c]][d]);
}

int check(int a,int b,int c,int d,int e){
	return t[t[t[t[t[0][a]][b]][c]][d]][e];
}


int main(void){
	int count=0;
	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++){
			cin>>t[i][j];
		}
	}
	for(int cd=0;cd<10000;cd++){
		int code=cd;
		bool flag=true;
		int digit=getdigit(code);
		code=code*10+digit;
		int a=code/10000;
		int b=(code%10000)/1000;
		int c=(code%1000)/100;
		int d=(code%100)/10;
		int e=digit;
		// replacement
		for(int i=1;i<10;i++){
			// if(digit==getdigit((a+i)%10,b,c,d))goto FAIL;
			if(check((a+i)%10,b,c,d,e)==0)goto FAIL;
		}
		for(int i=1;i<10;i++){
			// if(digit==getdigit(a,(b+i)%10,c,d))goto FAIL;
			if(0==check(a,(b+i)%10,c,d,e))goto FAIL;
		}
		for(int i=1;i<10;i++){
			// if(digit==getdigit(a,b,(c+i)%10,d))goto FAIL;
			if(0==check(a,b,(c+i)%10,d,e))goto FAIL;
		}
		for(int i=1;i<10;i++){
			// if(digit==getdigit(a,b,c,(d+i)%10))goto FAIL;
			if(0==check(a,b,c,(d+i)%10,e))goto FAIL;
		}
		for(int i=1;i<10;i++){
			// if(((digit+i)%10)==getdigit(a,b,c,d))goto FAIL;
			if(0==check(a,b,c,d,(e+i)%10))goto FAIL;
		}

		if(a!=b&&0==check(b,a,c,d,e))goto FAIL;
		if(c!=b&&0==check(a,c,b,d,e))goto FAIL;
		if(d!=c&&0==check(a,b,d,c,e))goto FAIL;
		if(e!=d&&0==check(a,b,c,e,d))goto FAIL;
		goto SUCCESS;
FAIL:
		count++;
		continue;
SUCCESS:;
	}
	cout<<count<<endl;
	return 0;
}