题意:首先求出来添加e1后的五位数,比如20163或20166之类的,e就是它的最后一位数,将这个五位数按两种情况变换:任意一位换成别的数字或是交换挨着的两位数,变换后的新五位数的最后一位是e1,由新五位数的前四位算出e2,如果e1不等于e2就ans++,输出ans
#include<cstdio>
#include<memory.h>
#include<algorithm>
using namespace std;
const int maxn = 10000;
int m[10][10];
int ssn[10];
int values[100005];
int id;
void fenjie(int n, int m) {
for (int i = m; i >= 1; i--) {
ssn[i] = n % 10;
n = n / 10;
}
}
void qiue() {
for (int i = 0; i<maxn; i++) {
memset(ssn, 0, sizeof(ssn));
fenjie(i, 4);
id = m[0][ssn[1]];
for (int k = 1; k <= 3; k++)
id = m[id][ssn[k + 1]];
values[i] = i * 10 + id;//先把每个四位数加上e后的五位数保存下来
}
}
int ckerror(int n) {
int i, j, k;
for (i = 1; i <= 5; i++)
{
for (j = 0; j <= 9; j++)
{
fenjie(n, 5);
if (ssn[i] == j) continue;
else {
ssn[i] = j;
for (int k = 1; k <= 5; k++)
ssn[k] = m[ssn[k - 1]][ssn[k]];
if (!ssn[5]) return 1;
}
}
}
for (j = 1; j <= 4; j++)
{
fenjie(n, 5);
if (ssn[j] == ssn[j + 1]) continue;
swap(ssn[j], ssn[j + 1]);
for (k = 1; k <= 5; k++)
ssn[k] = m[ssn[k - 1]][ssn[k]];
if (!ssn[5]) return 1;
}
return 0;
}
int main() {
int ans = 0,i,j,k;
for (i = 0; i<10; i++)
for (j = 0; j<10; j++)
scanf("%d", &m[i][j]);
qiue();
for (i = 0; i<maxn; i++)
if (ckerror(values[i]))
ans++;
printf("%d\n", ans);
return 0;
}