fork download
  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. #include<string.h>
  5. #include<vector>
  6. #include<queue>
  7.  
  8. using namespace std;
  9. int n, ans;
  10. bool v[20][20];
  11.  
  12. void visited(int x, int y) {
  13. v[x][y] = true;
  14.  
  15. for (int i = 0; i < n; i++)
  16. v[x][i] = true;
  17.  
  18. for (int i = 0; i < n; i++)
  19. v[i][y] = true;
  20.  
  21. int X = x; int Y = y;
  22.  
  23. while (1) {
  24. X += 1;
  25. Y += 1;
  26.  
  27. if (X == n || Y == n)
  28. break;
  29.  
  30. v[X][Y] = true;
  31. }
  32.  
  33. X = x; Y = y;
  34.  
  35. while (1) {
  36. X -= 1;
  37. Y -= 1;
  38.  
  39. if (X == -1 || Y == -1)
  40. break;
  41.  
  42. v[X][Y] = true;
  43. }
  44. X = x; Y = y;
  45.  
  46. while (1) {
  47. X += 1;
  48. Y -= 1;
  49.  
  50. if (X == n || Y == -1)
  51. break;
  52.  
  53. v[X][Y] = true;
  54. }
  55.  
  56. X = x; Y = y;
  57.  
  58. while (1) {
  59. X -= 1;
  60. Y += 1;
  61.  
  62. if (X == -1 || Y == n)
  63. break;
  64.  
  65. v[X][Y] = true;
  66. }
  67. }
  68.  
  69. void unvisited(int x, int y) {
  70. v[x][y] = false;
  71.  
  72. for (int i = 0; i < n; i++)
  73. v[x][i] = false;
  74.  
  75. for (int i = 0; i < n; i++)
  76. v[i][y] = false;
  77.  
  78. int X = x; int Y = y;
  79.  
  80. while (1) {
  81. X += 1;
  82. Y += 1;
  83.  
  84. if (X == n || Y == n)
  85. break;
  86.  
  87. v[X][Y] = false;
  88. }
  89.  
  90. X = x; Y = y;
  91.  
  92. while (1) {
  93. X -= 1;
  94. Y -= 1;
  95.  
  96. if (X == -1 || Y == -1)
  97. break;
  98.  
  99. v[X][Y] = false;
  100. }
  101.  
  102. X = x; Y = y;
  103.  
  104. while (1) {
  105. X += 1;
  106. Y -= 1;
  107.  
  108. if (X == n || Y == -1)
  109. break;
  110.  
  111. v[X][Y] = false;
  112. }
  113.  
  114. X = x; Y = y;
  115.  
  116. while (1) {
  117. X -= 1;
  118. Y += 1;
  119.  
  120. if (X == -1 || Y == n)
  121. break;
  122.  
  123. v[X][Y] = false;
  124. }
  125.  
  126. }
  127.  
  128. bool check(int x, int y) {
  129.  
  130. if (v[x][y] == true)
  131. return false;
  132.  
  133. return true;
  134. }
  135.  
  136. void dfs(int x, int y) {
  137. if (x == n) {
  138. ans+=1;
  139. return;
  140. }
  141.  
  142. for (int i = 0; i < n; i++) {
  143. if (check(x + 1, i)==true) {
  144. visited(x + 1, i);
  145. dfs(x + 1, i);
  146. unvisited(x + 1, i);
  147. }
  148. }
  149.  
  150. }
  151.  
  152. int main() {
  153.  
  154. cin >> n;
  155. dfs(-1, -1);
  156.  
  157. printf("%d\n", ans);
  158.  
  159. return 0;
  160. }
Success #stdin #stdout 3.81s 15232KB
stdin
8
stdout
76453656