কম্পিউটার

একটি নম্বর লিঙ্ক গেম?


সংখ্যার লিঙ্ক হল এক ধরনের লজিক ধাঁধা যার মধ্যে একটি গ্রিডে নম্বর সংযোগ করার পথ খুঁজে পাওয়া যায়৷

একটি নম্বর লিঙ্ক গেম?

নম্বরলিঙ্ক ধাঁধার একটি সহজ উদাহরণ নম্বরলিঙ্ক ধাঁধার সমাধান

একটি নম্বর লিঙ্ক গেম?

নিয়ম৷ − প্লেয়ারকে একক অবিচ্ছিন্ন লাইন (বা পাথ) দিয়ে গ্রিডে সমস্ত মিলে যাওয়া নম্বর জোড়া দিতে হবে। রেখাগুলি একে অপরের উপর শাখা বা ক্রস করতে পারে না, এবং সংখ্যাগুলি প্রতিটি লাইনের শেষে পড়তে হবে (অর্থাৎ, মাঝখানে নয়)। এটি বিবেচনা করা হয় যে একটি সমস্যা শুধুমাত্র তখনই ভালভাবে ডিজাইন করা হয় যখন এটির একটি অনন্য সমাধান থাকে এবং গ্রিডের সমস্ত কক্ষগুলি পূর্ণ হয়, যদিও কিছু নম্বরলিঙ্ক ডিজাইনাররা এটি নির্দিষ্ট করে না৷

খেলা − বর্গের একটি 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) , l) আছে আংশিকভাবে নির্মিত বর্তমান পথ হল (i, j)।

  • যদি এমন কোন প্রতিবেশী (k, l) খুঁজে না পাওয়া যায়, তবে পথটি আর বাড়ানো যাবে না, তাই লুপটি ভেঙে ফেলুন

  • অন্যথায়, (i, j) এবং (k, l) এর অন্তর্গত দুটি ইউনিয়ন- খুঁজুন গাছের মিলন তৈরি করুন৷

  • নতুন পথের শুরুতে এবং শেষে যে দুটি স্কোয়ারের শেষ পয়েন্ট পতাকা সেট করুন।

  • সফলতা ফেরত

ইনপুট

<পূর্ব>| || || || || || || 4 || || || || || || 3 || || || || 2 || 2 || || || 3 || || || || || এক্স || || 1 || || || 6 || || || 7 || 7 || 5 || 4 || || এক্স || || এক্স || 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 || এক্স || 1 || 1 || 4 || 4 || 6 || 1 || 1 || 7 || 7 || 5 || 4 || 6 || এক্স || 1 || এক্স || 1 || 5 || 5 || 6 || 6 || 1 || 1 || 1 |

উদাহরণ

#include#include#includestruct _node { struct _node *parent; int র্যাঙ্ক; int path_number; int endpoint;};typedef struct _node node;/* Name:initboard()Input:2D-array of pointers, array row/columnOutput এর আকার:--void--Description:পয়েন্টারগুলির একটি টেবিল নেয় এবং এটি শুরু করে। */void initboard(নোড ***arr, int n) { int i, j; (i=0;iর্যাঙ্ক =0; np->অভিভাবক =NULL; np->পথ_সংখ্যা =0; np->শেষ বিন্দু =0; arr[i][j] =np; } }}/*


ইনপুট:একটি নোডআউটপুট:সেটের সেট পয়েন্টার নোডের অন্তর্গত

বিবরণ৷ - একটি নোড নেয় এবং সেট পয়েন্টার ফেরত দেয়। */

node *findset(node ​​*n) { if (n->parent !=NULL) n =n->অভিভাবক; রিটার্ন n;} void setunion(node ​​*x, node *y) { x =findset(x); y =findset(y); যদি (x->র্যাঙ্ক> y->র্যাঙ্ক) y->পিতা =x; অন্য { x->পিতা =y; যদি(x->র্যাঙ্ক ==y->র্যাঙ্ক) y->র্যাঙ্ক++; }}int neighbour(int n, node ***arr) { int i1, i2, j1, j2, ct =0, পতাকা =0, a, b,k2; int k =rand()%(n*n); যখন (ct <(n*n)) { k %=(n*n); i1 =k/n; j1 =k%n; যদি (arr[i1][j1]->path_number==0) { int kk =rand()%4; int cc =0; সুইচ (কেকে) { কেস 0:i2=i1-1; j2=j1-0; if(i2>=0 &&i2path_number==0) { পতাকা=1; বিরতি } } cc++; কেস 1:i2=i1-0; j2=j1-1; if(j2>=0 &&i2path_number==0) { পতাকা=1; বিরতি } } cc++; কেস 2:i2=i1+1; j2=j1-0; if(i2path_number==0) { পতাকা=1; বিরতি } } cc++; কেস 3:i2=i1-0; j2=j1+1; if(i2path_number==0) { পতাকা=1; বিরতি } } cc++; কেস 4:if(cc==4) বিরতি; i2=i1-1; j2=j1-0; if(i2>=0 &&i2path_number==0) { পতাকা=1; বিরতি } } cc++; কেস 5:if(cc==4) বিরতি; i2=i1-0; j2=j1-1; if(j2>=0 &&i2path_number==0) { পতাকা=1; বিরতি } } cc++; কেস 6:if(cc==4) বিরতি; i2=i1+1; j2=j1-0; if(i2path_number==0) { পতাকা=1; বিরতি } } cc++; কেস 7:if(cc==4) বিরতি; i2=i1-0; j2=j1+1; if(i2path_number==0) { পতাকা=1; বিরতি } } cc++; } } যদি (পতাকা==1) বিরতি; ct++; k++; } if(ct0 &&findset(arr[i-1][j])==findset(arr[ii][jj])) ct++; if(i0 &&findset(arr[i][j-1])==findset(arr[ii][jj])) ct++; if(j1) রিটার্ন 0; অন্যথায় রিটার্ন 1;}int valid_next(int k, int n, node ***arr) { int i1, i2, j1, j2, a, b, kk, stat,ct=0; int পতাকা =0; i1=k/n; j1=k%n; kk =rand()%4; সুইচ(কেকে) { কেস 0:i2=i1-1; j2=j1-0; if(i2>=0 &&i2path_number==0) { stat=checkneigh(k, (n*i2 + j2),n,arr ); if(stat) { পতাকা=1; বিরতি } } } ct++; কেস 1:i2=i1-0; j2=j1-1; if(j2>=0 &&i2path_number==0) { stat=checkneigh(k, (n*i2 + j2),n,arr ); //printf("%d\n", stat); if(stat) { পতাকা=1; বিরতি } } } ct++; কেস 2:i2=i1+1; j2=j1-0; if(i2path_number==0) { stat=checkneigh(k, (n*i2 + j2), n,arr); //printf("%d\n", stat); if(stat) { পতাকা=1; বিরতি } } } ct++; কেস 3:i2=i1-0; j2=j1+1; if(i2path_number==0) { stat=checkneigh(k, (n*i2 + j2), n,arr); //printf("%d\n", stat); if(stat) { পতাকা=1; বিরতি } } } ct++; কেস 4:if(ct==4) বিরতি; i2=i1-1; j2=j1-0; if(i2>=0 &&i2path_number==0) { stat=checkneigh(k, (n*i2 + j2),n,arr ); //printf("%d\n", stat); if(stat) { পতাকা=1; বিরতি } } } ct++; কেস 5:if(ct==4) বিরতি; i2=i1-0; j2=j1-1; if(j2>=0 &&i2path_number==0) { stat=checkneigh(k, (n*i2 + j2),n,arr ); //printf("%d\n", stat); if(stat) { পতাকা=1; বিরতি } } } ct++; কেস 6:if(ct==4) বিরতি; i2=i1+1; j2=j1-0; if(i2path_number==0) { stat=checkneigh(k, (n*i2 + j2), n,arr); //printf("%d\n", stat); if(stat) { পতাকা=1; বিরতি } } } ct++; কেস 7:if(ct==4) বিরতি; i2=i1-0; j2=j1+1; if(i2path_number==0) { stat=checkneigh(k, (n*i2 + j2), n,arr); //printf("%d\n", stat); if(stat) { পতাকা=1; বিরতি } } } ct++; } //printf("পতাকা- %d\n",পতাকা); যদি (পতাকা==0) রিটার্ন -1; if(পতাকা) { //printf("মান পাঠানো হয়েছে- %d\n", i2*n + j2); রিটার্ন (i2*n)+j2; }}int addpath(node ​​***arr, int n, int ptno) { int a,b,k1,k2; int i1,j1,i2,j2; k2 =প্রতিবেশী( n, arr); if(k2==-1) //রিটার্ন 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]->শেষ পয়েন্ট =1; arr[i2][j2]->path_number=ptno; arr[i1][j1]->path_number=ptno; নোড *n1, *n2; n1=arr[i1][j1]; n2=arr[i2][j2]; n1=findset(n1); n2 =findset(n2); সেটুনিয়ন(n1, n2); যখন(1) { i1=i2; j1=j2; k1=(i1*n)+j1; k2=valid_next(k1,n,arr); if(k2==-1) { arr[i1][j1]->এন্ডপয়েন্ট=1; বিরতি } i2=k2/n; j2=k2%n; arr[i2][j2]->path_number=ptno; নোড *n1, *n2; n1=arr[i1][j1]; n2=arr[i2][j2]; n1=findset(n1); n2 =findset(n2); সেটুনিয়ন (n1, n2); } রিটার্ন 1;} void printtable(node ​​***arr, int n) { int i,j; printf("সারণী সমাধান করা হবে:\n"); for(i=0;iশেষ বিন্দু ==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\nউপরের টেবিলের সমাধান:\n"); for(i=0;ipath_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; নোড*** পয়েন্টার =(নোড ***)ম্যালক(n*sizeof(নোড **)); (i=0; i 
  1. একটি গেমে n থেকে শুরু করে সর্বনিম্ন নম্বর খুঁজে পেতে C++ কোড

  2. C++ এ 24 গেম

  3. C# এ সেমাফোর

  4. পাইথনে সংখ্যা হ্রাসকারী গেমের বিজয়ী খুঁজে বের করার প্রোগ্রাম