Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

एक नंबर लिंक गेम?


नंबर लिंक एक प्रकार की तर्क पहेली है जिसमें ग्रिड में संख्याओं को जोड़ने के लिए पथ खोजना शामिल है।

एक नंबर लिंक गेम?

नंबरलिंक पहेली का एक सरल उदाहरण नंबरलिंक पहेली का समाधान

एक नंबर लिंक गेम?

नियम - खिलाड़ी को ग्रिड पर सभी मिलान संख्याओं को एकल निरंतर लाइनों (या पथ) के साथ जोड़ना होता है। रेखाएं शाखा नहीं कर सकती हैं या एक-दूसरे को पार नहीं कर सकती हैं, और संख्याओं को प्रत्येक पंक्ति के अंत में गिरना है (अर्थात, बीच में नहीं)। यह माना जाता है कि कोई समस्या तभी अच्छी तरह से डिज़ाइन की जाती है जब उसका एक अनूठा समाधान हो और ग्रिड में सभी सेल भरे हों, हालाँकि कुछ नंबरलिंक डिज़ाइनर इसे निर्धारित नहीं करते हैं।

खेल - वर्गों के एक n × n सरणी पर विचार करें। कुछ वर्ग खाली हैं, कुछ ठोस हैं, और कुछ गैर-ठोस वर्ग पूर्णांक 1, 2, 3, ... द्वारा चिह्नित किए गए हैं। प्रत्येक पूर्णांक बोर्ड पर ठीक दो अलग-अलग वर्गों में रहता है। खिलाड़ी का कार्य बोर्ड पर प्रत्येक पूर्णांक की दो घटनाओं को केवल क्षैतिज और ऊर्ध्वाधर आंदोलनों का उपयोग करके एक सरल पथ से जोड़ना है। किसी भी दो अलग-अलग रास्तों को एक दूसरे को काटने की अनुमति नहीं है। किसी भी पथ में कोई ठोस वर्ग शामिल नहीं हो सकता है (ठोस वर्गों को किसी भी पथ पर प्रकट होने की मनाही है)। अंत में, सभी गैर-ठोस वर्ग पथों से भरे जाने चाहिए।

एल्गोरिदम - दिए गए बोर्ड आकार n × n के साथ एक वैध यादृच्छिक पहेली तैयार करने के लिए, हम पहले बोर्ड पर यादृच्छिक सरल पारस्परिक रूप से गैर-प्रतिच्छेदन पथ उत्पन्न करते हैं। यदि कुछ पृथक वर्ग सभी उत्पन्न पथों के बाहर रहते हैं, तो इन पृथक वर्गों को ठोस (निषिद्ध) के रूप में चिह्नित करें। फिर हम पहेली के रूप में पथ के अंतिम बिंदु और ठोस वर्गों की सूची प्रदान करते हैं।

इस प्रकार हम पहले एक समाधान उत्पन्न करते हैं और फिर समाधान से पहेली को हल करते हैं। पथ और ठोस वर्ग n × n बोर्ड को विभाजित करते हैं। हम इस विभाजन को उत्पन्न करने के लिए एक संघ-खोज डेटा संरचना का उपयोग करते हैं। डेटा संरचना बोर्ड पर n^2 वर्गों के सेट के सबसेट से संबंधित है।

स्पष्टीकरण

  • बोर्ड पर यादृच्छिक रूप से वर्ग (i, j) और (k, l) का पता लगाएँ जैसे:(a) (i, j) और (k, l) एक दूसरे के पड़ोसी हों, और (b) न तो (i, j) न ही (k, l) अब तक सृजित किसी पथ से संबंधित है। यदि पूरे बोर्ड पर वर्गों का ऐसा कोई जोड़ा नहीं मिलता है, तो वापसी / * यहाँ, (i, j) और (k, l) निर्माण के लिए नए पथ पर पहले दो वर्ग हैं। **

  • (i, j) और (k, l) वाले दो संघ-खोज वाले पेड़ों का एक संघ बनाएं।

  • जब तक वर्तमान पथ को बढ़ाया जा सकता है तब तक दोहराएं:नाम बदलें (i, j) =(k, l)। (i, j) के एक यादृच्छिक पड़ोसी वर्ग (k, l) का पता लगाएँ जैसे:(a) (k, l) अब तक उत्पन्न किसी भी पथ से संबंधित नहीं है (वर्तमान एक सहित) (b) एकमात्र पड़ोसी (k) , एल) में आंशिक रूप से निर्मित वर्तमान पथ (i, j) है।

  • यदि ऐसा कोई पड़ोसी (k, l) नहीं मिलता है, तो पथ को आगे नहीं बढ़ाया जा सकता है, इसलिए लूप को तोड़ दें

  • अन्यथा, दो संघ-ढूंढें वृक्षों का मिलन करें जिनसे (i, j) और (k, l) संबंधित हैं।

  • नए पथ के आरंभ और अंत में दो वर्गों के समापन बिंदु फ़्लैग सेट करें।

  • वापसी सफलता

इनपुट

| || || || || || || 4 |
| || || || || || 3 || |
| || || 2 || 2 || || || 3 |
| || || || || X || || 1 |
| || || 6 || || || 7 || 7 |
| 5 || 4 || || X || || X || 1 |
| || 5 || || 6 || || || |

आउटपुट

उपरोक्त तालिका का समाधान

| 4 || 4 || 4 || 4 || 4 || 4 || 4 |
| 4 || 1 || 1 || 1 || 1 || 3 || 3 |
| 4 || 1 || 2 || 2 || 1 || 1 || 3 |
| 4 || 1 || 1 || 1 || X || 1 || 1 |
| 4 || 4 || 6 || 1 || 1 || 7 || 7 |
| 5 || 4 || 6 || X || 1 || X || 1 |
| 5 || 5 || 6 || 6 || 1 || 1 || 1 |

उदाहरण

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct _node {
   struct _node *parent;
   int rank;
   int path_number;
   int endpoint;
};
typedef struct _node node;
/* Name: initboard()
Input: 2D-array of pointers, size of array row/column
Output: --void--
Description: Takes a table of pointers and initializes it. */
void initboard(node ***arr, int n) {
   int i, j;
   for (i=0;i<n;i++){
      for (j=0;j<n;j++){
         node *np;
         np = (node *)malloc(sizeof(node));
         np->rank = 0;
         np->parent = NULL;
         np->path_number = 0;
         np->endpoint = 0;
         arr[i][j] = np;
      }
   }
}
/*


Input:a node
Output:the set pointer of the set the node belongs to

विवरण - एक नोड लेता है और सेट पॉइंटर लौटाता है। */

node *findset(node *n) {
   if (n->parent != NULL)
      n = n->parent;
   return n;
}
void setunion(node *x, node *y) {
   x = findset(x);
   y = findset(y);
   if (x->rank > y->rank)
      y->parent = x;
   else {
      x->parent = y;
      if(x->rank == y->rank)
         y->rank++;
   }
}
int neighbour(int n, node ***arr) {
   int i1, i2, j1, j2, ct = 0, flag = 0, a, b,k2;
   int k = rand()%(n*n);
   while (ct < (n*n)) {
      k %= (n*n);
      i1 = k/n;
      j1 = k%n;
      if (arr[i1][j1]->path_number==0) {
         int kk = rand()%4;
         int cc = 0;
         switch (kk) {
            case 0: i2= i1-1;
               j2= j1-0;
            if(i2>=0 && i2<n && j2<n) {
               if(arr[i2][j2]->path_number==0) {
                  flag=1;
                  break;
               }
            }
            cc++;
            case 1: i2= i1-0;
               j2= j1-1;
            if(j2>=0 && i2<n && j2<n) {
               if(arr[i2][j2]->path_number==0) {
                  flag=1;
                  break;
               }
            }
            cc++;
            case 2: i2= i1+1;
            j2= j1-0;
            if(i2<n && j2<n) {
               if(arr[i2][j2]->path_number==0) {
                  flag=1;
                  break;
               }
            }
            cc++;
            case 3: i2= i1-0;
            j2= j1+1;
            if(i2<n && j2<n) {
               if(arr[i2][j2]->path_number==0) {
                  flag=1;
                  break;
               }
            }
            cc++;
            case 4: if(cc==4)
               break;
            i2= i1-1;
            j2= j1-0;
            if(i2>=0 && i2<n && j2<n) {
               if(arr[i2][j2]->path_number==0) {
                  flag=1;
                  break;
               }
            }
            cc++;
            case 5: if(cc==4)
               break;
            i2= i1-0;
            j2= j1-1;
            if(j2>=0 && i2<n && j2<n) {
               if(arr[i2][j2]->path_number==0) {
                  flag=1;
                  break;
               }
            }
            cc++;
            case 6: if(cc==4)
               break;
            i2= i1+1;
            j2= j1-0;
            if(i2<n && j2<n) {
               if(arr[i2][j2]->path_number==0) {
                  flag=1;
                  break;
               }
            }
            cc++;
            case 7: if(cc==4)
               break;
            i2= i1-0;
            j2= j1+1;
            if(i2<n && j2<n) {
               if(arr[i2][j2]->path_number==0) {
                  flag=1;
                  break;
               }
            }
            cc++;
         }
      }
      if(flag==1)
         break;
         ct++;
         k++;
   }
   if(ct<n*n) {
      k2= (i2*n)+j2;
      return k*(n*n)+k2;
   } else {
      return -1;
   }
}
int checkneigh(int k1, int k2, int n, node ***arr) {
   int i= k2/n;
   int j= k2%n;
   int ii= k1/n;
   int jj= k1%n;
   int ct=0;
   if(i>0 && findset(arr[i-1][j])==findset(arr[ii][jj]))
      ct++;
   if(i<n-1 && findset(arr[i+1][j])==findset(arr[ii][jj]))
      ct++;
   if(j>0 && findset(arr[i][j-1])==findset(arr[ii][jj]))
      ct++;
   if(j<n-1 && findset(arr[i][j+1])==findset(arr[ii][jj]))
      ct++;
   if(ct>1)
      return 0;
   else
      return 1;
}
int valid_next(int k, int n, node ***arr) {
   int i1, i2, j1, j2, a, b, kk, stat,ct=0;
   int flag=0;
   i1= k/n;
   j1= k%n;
   kk= rand()%4;
   switch(kk) {
      case 0: i2= i1-1;
         j2= j1-0;
      if(i2>=0 && i2<n && j2<n) {
         if(arr[i2][j2]->path_number==0) {
            stat= checkneigh(k, (n*i2 + j2),n,arr);
            if(stat) {
               flag=1;
               break;
            }
         }
      }
      ct++;
      case 1: i2= i1-0;
         j2= j1-1;
      if(j2>=0 && i2<n && j2<n) {
         if(arr[i2][j2]->path_number==0) {
            stat= checkneigh(k, (n*i2 + j2),n,arr);
            //printf("%d\n",stat);
            if(stat) {
               flag=1;
               break;
            }
         }
      }
      ct++;
      case 2: i2= i1+1;
         j2= j1-0;
      if(i2<n && j2<n) {
         if(arr[i2][j2]->path_number==0) {
            stat= checkneigh(k, (n*i2 + j2),n,arr);
            //printf("%d\n",stat);
            if(stat) {
               flag=1;
               break;
            }
         }
      }
      ct++;
      case 3: i2= i1-0;
         j2= j1+1;
      if(i2<n && j2<n) {
         if(arr[i2][j2]->path_number==0) {
            stat= checkneigh(k, (n*i2 + j2),n,arr);
            //printf("%d\n",stat);
            if(stat) {
               flag=1;
               break;
            }
         }
      }
      ct++;
      case 4: if(ct==4)
         break;
      i2= i1-1;
      j2= j1-0;
      if(i2>=0 && i2<n && j2<n) {
         if(arr[i2][j2]->path_number==0) {
            stat= checkneigh(k, (n*i2 + j2),n,arr);
            //printf("%d\n",stat);
            if(stat) {
               flag=1;
               break;
            }
         }
      }
      ct++;
      case 5: if(ct==4)
         break;
      i2= i1-0;
      j2= j1-1;
      if(j2>=0 && i2<n && j2<n) {
         if(arr[i2][j2]->path_number==0) {
            stat= checkneigh(k, (n*i2 + j2),n,arr);
            //printf("%d\n",stat);
            if(stat) {
               flag=1;
               break;
            }
         }
      }
      ct++;
      case 6: if(ct==4)
         break;
      i2= i1+1;
      j2= j1-0;
      if(i2<n && j2<n) {
         if(arr[i2][j2]->path_number==0) {
            stat= checkneigh(k, (n*i2 + j2),n,arr);
            //printf("%d\n",stat);
            if(stat) {
               flag=1;
               break;
            }
         }
      }
      ct++;
      case 7: if(ct==4)
         break;
      i2= i1-0;
      j2= j1+1;
      if(i2<n && j2<n) {
         if(arr[i2][j2]->path_number==0) {
            stat= checkneigh(k, (n*i2 + j2),n,arr);
            //printf("%d\n",stat);
            if(stat) {
               flag=1;
               break;
            }
         }
      }
      ct++;
   }
   //printf("flag- %d\n",flag);
   if(flag==0)
      return -1;
   if(flag) {
      //printf("value sent- %d\n", i2*n + j2);
      return (i2*n)+j2;
   }
}
int addpath(node ***arr, int n, int ptno) {
   int a,b,k1,k2;
   int i1,j1,i2,j2;
   k2= neighbour( n, arr);
   if(k2==-1) //no valid pair found to start with
      return 0;
   k1= k2/(n*n);
   k2= k2%(n*n);
   //printf("%d %d\n",k1,k2);
   i1= k1/n;
   j1= k1%n;
   i2= k2/n;
   j2= k2%n;
   arr[i1][j1]->endpoint= 1;
   arr[i2][j2]->path_number= ptno;
   arr[i1][j1]->path_number= ptno;
   node *n1, *n2;
   n1= arr[i1][j1];
   n2= arr[i2][j2];
   n1= findset(n1);
   n2= findset(n2);
   setunion(n1, n2);
   while(1) {
      i1= i2;
      j1= j2;
      k1= (i1*n)+j1;
      k2= valid_next(k1,n,arr);
      if(k2==-1) {
         arr[i1][j1]->endpoint= 1;
         break;
      }
      i2=k2/n;
      j2=k2%n;
      arr[i2][j2]->path_number= ptno;
      node *n1, *n2;
      n1= arr[i1][j1];
      n2= arr[i2][j2];
      n1= findset(n1);
      n2= findset(n2);
      setunion(n1,n2);
   }
   return 1;
}
void printtable(node ***arr, int n) {
   int i,j;
   printf("Table to be solved:\n");
   for(i=0;i<n;i++) {
      for(j=0;j<n;j++) {
         if(arr[i][j]->endpoint ==1){
            if(arr[i][j]->path_number/10==0)
               printf("| %d |",arr[i][j]->path_number);
            else
               printf("| %d|",arr[i][j]->path_number);
         } else if(arr[i][j]->path_number==0)
            printf("| X |");
         else
            printf("| |");
      }
      printf("\n");
   }
   printf("\n\nThe solution to the above table:\n");
   for(i=0;i<n;i++) {
      for(j=0;j<n;j++) {
         if(arr[i][j]->path_number != 0){
            if(arr[i][j]->path_number/10==0)
               printf("| %d |",arr[i][j]->path_number);
            else
               printf("| %d|",arr[i][j]->path_number);
         } else
            printf("| X |");
      }
      printf("\n");
   }
}
int main(void) {
   srand((unsigned int) time (NULL));
   int i, j;
   int ct = 1;
   int n = 7;
   node*** pointers= (node ***)malloc(n*sizeof(node **));
   for (i=0; i<n; i++)
      pointers[i] = (node **)malloc(n*sizeof(node *));
   initboard(pointers, n);
   while(1) {
      i = addpath(pointers, n, ct);
      if (i==0) {
         break;
      } else {
         ct++;
      }
   }
   printtable(pointers,n);
   return 0;
}

  1. सी++ में 24 गेम

    मान लीजिए हमारे पास चार कार्ड हैं; इन कार्डों में 1 से 9 तक कुछ संख्याएँ हैं। हमें यह जाँचना होगा कि क्या वे 24 प्राप्त करने के लिए +, -, *, / जैसे कुछ ऑपरेटरों के माध्यम से काम कर सकते हैं। इसलिए यदि हमारे पास कुछ संख्याएँ हैं जैसे [4,9,2,6 ], तो हम 24 गुणा (4 * 9) – (2 * 6) प्राप्त कर सकते हैं, उत

  1. सी # में सेमाफोर

    सेमाफोर वर्ग आपको उन थ्रेड्स की संख्या पर एक सीमा निर्धारित करने देता है जिनकी एक महत्वपूर्ण खंड तक पहुंच है। संसाधनों के पूल तक पहुंच को नियंत्रित करने के लिए कक्षा का उपयोग किया जाता है। System.Threading.Semaphore सेमाफोर के लिए नाम स्थान है क्योंकि इसमें सेमाफोर को लागू करने के लिए आवश्यक सभी विध

  1. पायथन में संख्या कम करने वाले खेल के विजेता को खोजने का कार्यक्रम

    मान लीजिए अमल और बिमल एक खेल खेल रहे हैं। उनके पास एक संख्या n है और वे जांचते हैं कि यह 2 की शक्ति है या नहीं। यदि ऐसा है, तो वे इसे 2 से विभाजित करते हैं। अन्यथा, वे इसे अगली निचली संख्या से कम कर देते हैं जो कि 2 की शक्ति भी है। जो कोई भी संख्या को घटाकर 1 कर देगा वह गेम जीत जाएगा। अमल हमेशा खेल