Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

K-नाइट्स को ऐसे रखें कि वे C++ में एक-दूसरे पर हमला न करें

इस समस्या में, हमें तीन पूर्णांक मान K, N, M दिया जाता है। हमारा कार्य K शूरवीरों को NxM शतरंज की बिसात में इस तरह रखना है कि कोई भी दो शूरवीर एक दूसरे पर हमला न करें। 0 वैध तरीकों वाले मामले हो सकते हैं और कई वैध तरीकों वाले मामले भी हो सकते हैं। आपको सभी मान्य मामलों को प्रिंट करना होगा।

नाइट एक शतरंज का टुकड़ा है जो दो चाल आगे बढ़ता है और फिर एक दायें के बायें चलता है। यह बिसात में किसी भी दिशा में जा सकता है।

हमला वह स्थिति है जब एक टुकड़ा अपने वैध चाल के एक मौके में अन्य टुकड़ों के समान स्थान पर हो सकता है।

समस्या को समझने के लिए एक उदाहरण लेते हैं,

इनपुट - एम =3, एन =3, के =5

आउटपुट -

K A K
A K A
K A K

A K A
K K K
A K A

इस समस्या को हल करने के लिए, हम प्रत्येक पंक्ति में एक-एक करके शूरवीरों को कॉलम दर कॉलम रखना शुरू करेंगे। और प्रत्येक प्लेसमेंट के बाद हमला करने की तुलना में स्थिति की जांच करें। शूरवीरों को रखने पर हम जांच करेंगे कि यह सुरक्षित है या नहीं। यदि यह सुरक्षित है, तो हम इसे रखेंगे और फिर अगली स्थिति में चले जाएंगे। हम बैकट्रैकिंग का उपयोग करेंगे, ताकि सभी संभव तरीके प्राप्त किए जा सकें और इसके लिए हम बैकट्रैकिंग के लिए नाइट के प्रत्येक प्लेसमेंट के बाद एक नया बोर्ड बनाएंगे। इस प्रकार हम बैकट्रैकिंग . का उपयोग करके सभी संभावित समाधान प्राप्त करेंगे

उदाहरण

हमारे समाधान के कार्यान्वयन को दिखाने के लिए कार्यक्रम,

#include <iostream>
using namespace std;
int m, n, k, count = 0;
void displayPositions(char** board){
   cout<<endl;
   for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++) {
         cout<<board[i][j]<<"\t";
      }
      cout<<endl;
   }
}
void canattack(int i, int j, char a,
char** board){
   if ((i + 2) < m && (j - 1) >= 0) {
      board[i + 2][j - 1] = a;
   }
   if ((i - 2) >= 0 && (j - 1) >= 0) {
      board[i - 2][j - 1] = a;
   }
   if ((i + 2) < m && (j + 1)< n) {
      board[i + 2][j + 1] = a;
   }
   if ((i - 2) >= 0 && (j + 1) < n) {
      board[i - 2][j + 1] = a;
   }
   if ((i + 1) < m && (j + 2) <n) {
      board[i + 1][j + 2] = a;
   }
   if ((i - 1) >= 0 && (j + 2) < n) {
      board[i - 1][j + 2] = a;
   }
   if ((i + 1) < m && (j - 2) >= 0) {
      board[i + 1][j - 2] = a;
   }
   if ((i - 1) >= 0 && (j - 2) >= 0) {
      board[i - 1][j - 2] = a;
   }
}
bool canPlace(int i, int j, char** board){
   if (board[i][j] == '_')
      return true;
   else
      return false;
}
void place(int i, int j, char k, char a,
char** board, char** new_board){
   for (int y = 0; y < m; y++) {
      for (int z = 0; z < n; z++) {
         new_board[y][z] = board[y][z];
      }
   }
   new_board[i][j] = k;
   canattack(i, j, a, new_board);
}
void placeKnights(int k, int sti, int stj, char** board){
   if (k == 0) {
      displayPositions(board);
      count++;
   } else {
      for (int i = sti; i < m; i++) {
         for (int j = stj; j < n; j++) {
            if (canPlace(i, j, board)) {
               char** new_board = new char*[m];
               for (int x = 0; x < m; x++) {
                  new_board[x] = new char[n];
               }
               place(i, j, 'K', 'A', board, new_board);
               placeKnights(k - 1, i, j, new_board);
            }
         }
         stj = 0;
      }
   }
}
int main() {
   m = 3, n = 3, k = 5;
   char** board = new char*[m];
   for (int i = 0; i < m; i++)
   board[i] = new char[n];
   for (int i = 0; i < m; i++) {
      for (int j = 0; j < n; j++)
      board[i][j] = '_';
   }
   cout<<"The ways in which "<<k<<" knights can be placed in "<<m<<"x"<<n<<" chessboard are :\n";
   placeKnights(k, 0, 0, board);
   return 0;
}

आउटपुट

The ways in which 5 knights can be placed in 3x3 chessboard are :
K A K
A K A
K A K

A K A
K K K
A K A

यहां, हमने के द्वारा शूरवीरों की स्थिति और उन पदों को चिह्नित किया है जहां उन पर ए द्वारा हमला किया गया है।


  1. एक सरणी में सभी जोड़े (ए, बी) खोजें जैसे कि सी ++ में% बी =के

    मान लीजिए कि हमारे पास एक सरणी ए है, उस सरणी से, हमें सभी जोड़े (ए, बी) प्राप्त करना है जैसे कि ए% बी =के। मान लीजिए कि सरणी A =[2, 3, 4, 5, 7] और k =3 है, तो जोड़े (7, 4), (3, 4), (3, 5), (3, 7) हैं। इसे हल करने के लिए, हम सूची को देखेंगे और जांचेंगे कि दी गई शर्त संतोषजनक है या नहीं। उदाहरण #inc

  1. A में N अंक इस प्रकार जोड़ें कि वह C++ में प्रत्येक जोड़ के बाद B से विभाज्य हो?

    यहां हम देखेंगे कि एन अंकों को जोड़कर एक संख्या ए कैसे उत्पन्न की जाती है, और प्रत्येक चरण में नए अंक जोड़ते समय यह दूसरी संख्या बी से विभाज्य हो जाएगा। आइए विचार करें कि हम 4 जोड़कर 5 अंकों की संख्या बनाने जा रहे हैं। इसके साथ अतिरिक्त अंक। हम 7 से विभाज्यता की जांच करेंगे। संख्या 8 से शुरू होगी। त

  1. n बदमाशों को व्यवस्थित करने के कई तरीके खोजने का कार्यक्रम ताकि वे पायथन में एक दूसरे पर हमला न कर सकें

    मान लीजिए कि हमारे पास एक संख्या n है जो n x n आकार की शतरंज की बिसात का प्रतिनिधित्व करती है। हमें यह पता लगाना है कि हम कितने तरीकों से बदमाशों को रख सकते हैं, ताकि वे एक दूसरे पर हमला न कर सकें। यहां दो तरीकों को अलग माना जाएगा यदि किसी एक तरीके से, शतरंज की बिसात के कुछ सेल पर कब्जा कर लिया जाता