VasilM

5a_queens

Dec 8th, 2012
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<iostream>
  4.  
  5. using namespace std;
  6. /* Максимален размер на дъската */
  7. #define MAXN 100
  8.  
  9. /* Размер на дъската */
  10. unsigned n, x, y;   // + новите променливи за координатите на 1вата царица
  11.  
  12. unsigned col[MAXN] , RD[2*MAXN - 1],  // RD/LD десен/ляв диагонал
  13.          LD[2*MAXN], queens [MAXN];
  14. bool repeat = true;
  15.  
  16. /* Отпечатва намереното разположение на цариците */
  17. /*void printBoard()
  18. { unsigned i , j ;
  19.   for (i = 0; i < n; i++) {
  20.     printf("\n");
  21.     for (j = 0; j < n; j++)
  22.       if(queens[i] == j) printf("x ");
  23.       else printf(". ");
  24.   }
  25.   printf("\n");
  26.   exit(0);
  27. }*/
  28.  
  29. /* Намира следваща позиция за поставяне на царица */
  30. void generate(unsigned i)
  31. { if( repeat ){
  32.      if( i == n ) repeat = false;
  33.      if( i == x ) generate(i + 1); // проверка ако сме на реда на 1вата дама - прескачаме реда
  34.      unsigned k;    
  35.      for (k = 0; k <= n; k++) {
  36.        if (col[k] && RD[i + k] && LD[n + i - k]) {
  37.          col[k] = 0; RD[i + k] = 0; LD[n + i - k] = 0; queens[i] = k;
  38.          generate(i + 1);
  39.          col[k] = 1; RD[i + k] = 1; LD[n + i - k] = 1;
  40.        }
  41.      }
  42.     }
  43. }
  44.  
  45. int main(void) {
  46.   while( cin >> n >> x >> y ){
  47.     unsigned i;
  48.     for (i = 0; i < n; i++) col[i] = 1;
  49.     for (i = 0; i < (2*n - 1); i++) RD[i] = 1;
  50.     for (i = 0; i < 2*n; i++) LD[i] = 1;
  51.     x -= 1;        // реални координати
  52.     y -= 1;        //
  53.     col[y] = 0; RD[x + y] = 0; LD[n + x - y] = 0; queens[x] = y;  // x -> ред  y -> стълб  n -> размер на дъската
  54.     generate(0);
  55.     if( queens[n-1]+1 > n ) cout << 0 << endl;
  56.     else cout << queens[n-1]+1 << " " << n << endl;
  57.     repeat = true;
  58.   }
  59.   return 0;
  60. }
  61. /*
  62. Задача 5а. [6.3.5, стр. 363, queens.c]
  63. Да се реши задачата за разполагане на n царици на обобщена шахматна дъска с размери n x n,
  64. като разположението на една от цариците е дадено предварително.
  65.  
  66. Вход:
  67. На входа се задава числото n (n < 10) и координатите на дадената царица.
  68. Горният ляв ъгъл е с координати (1,1). Входът съдържа много примери на отделни редове.
  69. .
  70. Изход:
  71. За всеки пример на нов ред се отпечатват координатите на царицата,
  72. която се намира на последния (най-долу) ред на дъската. Ако разполагането е невъзможно се отпечатва числото 0.
  73.  
  74. Пример:
  75. 8 1 1
  76. 2 1 1
  77.  
  78. Решение на примера:
  79. 4 8
  80. 0
  81. */
Advertisement
Add Comment
Please, Sign In to add comment