原题:
http://codeforces.com/gym/101158/attachments
注意:表中并不是每行每列数字不重复出现
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <cmath>
#include <vector>
#include <utility>
#include <set>
#include <map>
#include <sstream>
#include <climits>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#define pi acos(-1.0)
#define INF 2147483647
using namespace std;
typedef long long ll;
typedef pair <int,int > P;
int table[12][12];
int num[10005];
int main ()
{
memset(table,0,sizeof(table));
memset(num,0,sizeof(num));
for(int i=0; i<10; i++)
for(int j=0; j<10; j++)
{
scanf("%d",&table[i][j]);
}
for(int text=0; text<=9999; text++)
{
int a,b,c,d,flag=text;
d=flag%10;
flag/=10;
c=flag%10;
flag/=10;
b=flag%10;
flag/=10;
a=flag;
flag=table[0][a];
flag=table[flag][b];
flag=table[flag][c];
flag=table[flag][d];
num[text]=flag;
}
int res=0;
for(int text=0; text<=9999; text++)
{
int a,b,c,d,dist,flag=text;
d=flag%10;
flag/=10;
c=flag%10;
flag/=10;
b=flag%10;
flag/=10;
a=flag;
dist=num[text];
bool ok=true;
for(int j=0; j<10; j++)
{
if(j==a)
continue;
flag=j*1000+b*100+c*10+d;
int cnt=num[flag];
if(table[cnt][dist]==0)
{
ok=false;
break;
}
}
if(ok)
for(int j=0; j<10; j++)
{
if(j==b)
continue;
flag=a*1000+j*100+c*10+d;
int cnt=num[flag];
if(table[cnt][dist]==0)
{
ok=false;
break;
}
}
if(ok)
for(int j=0; j<10; j++)
{
if(j==c)
continue;
flag=a*1000+b*100+j*10+d;
int cnt=num[flag];
if(table[cnt][dist]==0)
{
ok=false;
break;
}
}
if(ok)
for(int j=0; j<10; j++)
{
if(j==d)
continue;
flag=a*1000+b*100+c*10+j;
int cnt=num[flag];
if(table[cnt][dist]==0)
{
ok=false;
break;
}
}
if(ok)
for(int j=0; j<10; j++)
{
if(j==dist)
continue;
if(table[dist][j]==0)
{
ok=false;
break;
}
}
if(ok&&a!=b)
{
flag=b*1000+a*100+c*10+d;
int cnt=num[flag];
if(table[cnt][dist]==0)
{
ok=false;
}
}
if(ok&&b!=c)
{
flag=a*1000+c*100+b*10+d;
int cnt=num[flag];
if(table[cnt][dist]==0)
{
ok=false;
}
}
if(ok&&c!=d)
{
flag=a*1000+b*100+d*10+c;
int cnt=num[flag];
if(table[cnt][dist]==0)
{
ok=false;
}
}
if(ok&&d!=dist)
{
flag=a*1000+b*100+c*10+dist;
int cnt=num[flag];
if(table[cnt][d]==0)
{
ok=false;
}
}
if(!ok)
{
res++;
}
}
printf("%d\n",res);
return 0;
}