原题:
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; flag/=10; c=flag; flag/=10; b=flag; 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; flag/=10; c=flag; flag/=10; b=flag; 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; }