fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. int val[20][20];
  5. bitset<(1<<20)> seen;
  6. long long memo[1<<20];
  7. int n;
  8.  
  9. long long calc(int mask,int i)
  10. {
  11. if(mask==((1<<n)-1))
  12. return 1;
  13. if(seen.test(mask))
  14. return memo[mask];
  15. long long ret = 0;
  16. for(int j=0;j<n;++j)
  17. {
  18. if(val[i][j]==1 && !(mask&(1<<j)))
  19. ret += calc(mask|(1<<j),i+1);
  20. }
  21. seen.set(mask);
  22. return (memo[mask]=ret);
  23. }
  24.  
  25. int main()
  26. {
  27. int t;
  28. scanf("%d",&t);
  29. while(t--)
  30. {
  31. seen.reset();
  32. scanf("%d",&n);
  33. for(int i=0;i<n;++i)
  34. for(int j=0;j<n;++j)
  35. scanf("%d",&val[i][j]);
  36. long long ans = 0;
  37. for(int i=0;i<n;++i)
  38. if(val[0][i]==1)
  39. ans += calc(1<<i,1);
  40. printf("%lld\n",ans);
  41. }
  42. return 0;
  43. }
  44.  
Success #stdin #stdout 0s 11624KB
stdin
3
3
1 1 1
1 1 1
1 1 1
11
1 0 0 1 0 0 0 0 0 1 1 
1 1 1 1 1 0 1 0 1 0 0 
1 0 0 1 0 0 1 1 0 1 0 
1 0 1 1 1 0 1 1 0 1 1 
0 1 1 1 0 1 0 0 1 1 1 
1 1 1 0 0 1 0 0 0 0 0 
0 0 0 0 1 0 1 0 0 0 1 
1 0 1 1 0 0 0 0 0 0 1 
0 0 1 0 1 1 0 0 0 1 1 
1 1 1 0 0 0 1 0 1 0 1 
1 0 0 0 1 1 1 1 0 0 0 
11
0 1 1 1 0 1 0 0 0 1 0 
0 0 1 1 1 1 1 1 1 1 1 
1 1 0 1 0 0 0 0 0 1 0 
0 1 0 1 0 1 0 1 0 1 1 
1 0 0 1 0 0 0 0 1 0 1 
0 0 1 0 1 1 0 0 0 0 1 
1 0 1 0 1 1 1 0 1 1 0 
1 0 1 1 0 1 1 0 0 1 0 
0 0 1 1 0 1 1 1 1 1 1 
0 1 0 0 0 0 0 0 0 1 1 
0 1 1 0 0 0 0 0 1 0 1 seen
stdout
6
7588
7426