题目链接:Aizu 1368
题目思路:队友写了一个暴力,直接就过了。
AC代码:
/*
2017年8月11日16:48:24
Aizu - 1368
AC
暴力模拟
*/
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=15;
int tab[maxn][maxn];
int num[10];
int idtab[100005];
void getnum(int n,int m){
for(int i=m;i>=1;i--){
num[i]=n%10;
n=n/10;
}
}
void init(){
for(int i=0;i<10000;i++){
memset(num,0,sizeof(num));
getnum(i,4);
for(int j=1;j<=4;j++){
num[j]=tab[num[j-1]][num[j]];
}
idtab[i]=i*10+num[4];
//printf("%d %d %d\n",i,num[4],idtab[i]);
}
}
bool check(int n){
for(int i=1;i<=5;i++){
for(int j=0;j<=9;j++){
getnum(n,5);
if(num[i]==j) continue;//这种情况要跳过,不然会WA
else{
num[i]=j;
num[0]=0;
for(int k=1;k<=5;k++){
num[k]=tab[num[k-1]][num[k]];
}
if(num[5]==0) return true;
}
}
}
for(int j=1;j<=4;j++){
getnum(n,5);
if(num[j]==num[j+1]) continue; //同理这种情况也要跳过
swap(num[j],num[j+1]);
num[0]=0;
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(){
int ans=0;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
scanf("%d",&tab[i][j]);
}
}
init();
for(int i=0;i<10000;i++){
if(check(idtab[i])) ans++;
}
printf("%d\n",ans);
/*
test getnum(n,m)
getnum(14556,5);
for(int i=1;i<=5;i++){
printf("%d ",num[i]);
}
*/
/*
init();
*/
/*
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
printf("%d ",tab[i][j]);
}printf("\n");
}
*/
return 0;
}