首先贴上代码
#include <bits/stdc++.h>
using namespace std;
const int M = 10;
int n, a[M][6], ans;
int f[6];
int difence[M];
int g(int x, int y) {
return (x <= y) ? (y - x) : (10 - x + y);
}
bool calc(int x) {
int cnt = 0;
for (int i = 1; i <= 5; ++ i )
if (f[i] != a[x][i])
difence[++cnt] = i;
if ((!cnt)||cnt > 2)
return false;
if (cnt == 1)
return true;
if (abs(difence[1] - difence[2]) != 1)
return false;
return (g(f[difence[1]], a[x][difence[1]]) == g(f[difence[2]], a[x][difence[2]]));
}
bool check() {
for (int i = 1; i <= n; ++ i )
if (!calc(i))
return false;
return true;
}
void dfs(int u) {
if (u > 5) {
ans += check();
return;
}
for (int i = 0; i < 10; ++ i ) {
f[u] = i;
dfs(u + 1);
}
return;
}
int main(void) {
scanf("%d",&n);
for (int i = 1; i <= n; ++ i )
for (int j = 1; j <= 5; ++ j )
scanf("%d",&a[i][j]);
dfs(1);
printf("%d",ans);
return 0;
}
其实以上大部分代码无关紧要,要命的是这几行:
if ((!cnt)||cnt > 2) //⑴
return false;
if (cnt == 1)
return true;
if (abs(difence[1] - difence[2]) != 1) //⑵
return false;
注意到,⑴处和⑵处都返回 false
所以按理来说,可以写成如下形式:
if ((!cnt)||cnt > 2||(abs(difence[1] - difence[2]) != 1))
return false;
if (cnt == 1)
return true;
求dalao指导 这是怎么回事