জাভা
বর্তমানে, আমার কোডটি অত্যন্ত দীর্ঘ এবং ক্লান্তিকর, আমি এটিকে আরও দ্রুত তৈরি করার জন্য কাজ করছি। আমি মানগুলি খুঁজে পেতে একটি পুনরাবৃত্ত পদ্ধতি ব্যবহার করি। এটি 2 বা 3 সেকেন্ডের মধ্যে প্রথম 5 টি গণনা করে তবে এটি পরে অনেক ধীর হয়ে যায়। এছাড়াও, সংখ্যাগুলি সঠিক কিনা তা সম্পর্কে আমি এখনও নিশ্চিত নই, তবে প্রথম কয়েকটি মন্তব্যগুলির সাথে একত্রে লেগেছে বলে মনে হচ্ছে। কোন পরামর্শ স্বাগত।
আউটপুট
2x2: 3
4x4: 30
6x6: 410
8x8: 6148
10x10: 96120
ব্যাখ্যা
মূল ধারণাটি পুনরাবৃত্তি। মূলত আপনি একটি শূন্য বোর্ড, সমস্ত জিরো সহ একটি বোর্ড দিয়ে শুরু করুন। পুনরাবৃত্তির পদ্ধতিটি কেবল পরবর্তী অবস্থানে কোনও কালো বা সাদা ভাঁড় স্থাপন করতে পারে কিনা তা পরীক্ষা করে দেখায়, যদি এটি কেবল একটি রঙ রাখতে পারে তবে এটি সেখানে রাখে এবং নিজেই কল করে। যদি এটি উভয় রঙগুলিকে রাখতে পারে তবে এটি নিজেকে দুটি বার কল করে, প্রতিটি রঙের সাথে একটি। প্রতিবার যখন এটি নিজেকে কল করে তখন স্কোয়ারগুলি বামে এবং উপযুক্ত রঙ বামে হ্রাস পায়। এটি যখন পুরো বোর্ডটি পূরণ করবে তখন এটি বর্তমান গণনাটি +1 প্রদান করে If যদি এটি জানতে পারে যে পরবর্তী অবস্থানে কালো বা সাদা ভাঁড় দেওয়ার কোনও উপায় নেই, তবে এটি 0 ফিরে আসে, যার অর্থ এটি একটি মরা পথ।
কোড
public class Chess {
public static void main(String[] args){
System.out.println(solve(1));
System.out.println(solve(2));
System.out.println(solve(3));
System.out.println(solve(4));
System.out.println(solve(5));
}
static int solve(int n){
int m =2*n;
int[][] b = new int[m][m];
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
b[i][j]=0;
}
}
return count(m,m*m,m*m/2,m*m/2,0,b);
}
static int count(int n,int sqLeft, int bLeft, int wLeft, int count, int[][] b){
if(sqLeft == 0){
/*for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
System.out.print(b[i][j]);
}
System.out.println();
}
System.out.println();*/
return count+1;
}
int x=(sqLeft-1)%n;
int y=(sqLeft-1)/n;
if(wLeft==0){
if(y!=0){
if ((x==0?true:b[x-1][y-1]!=1)&&(x==n-1?true:b[x+1][y-1]!= 1)) {
b[x][y] = 2;
return count(n, sqLeft-1, bLeft-1, wLeft, count, b);
} else {
return 0;
}
} else {
b[x][y]=2;
return count(n,sqLeft-1,bLeft-1,wLeft,count,b);
}
} else if(bLeft==0){
if(y!=n-1){
if((x==0?true:b[x-1][y+1]!=2)&&(x==n-1?true:b[x+1][y+1]!=2)){
b[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,b);
} else {
return 0;
}
} else {
b[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,b);
}
} else{
if(y==0){
if((x==0?true:b[x-1][y+1]!=2)&&(x==n-1?true:b[x+1][y+1]!=2)){
int[][] c=new int[n][n];
for(int i = 0; i < n; i++){
System.arraycopy(b[i], 0, c[i], 0, n);
}
b[x][y]=2;
c[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,c)+count(n,sqLeft-1,bLeft-1,wLeft,count,b);
} else {
b[x][y]=2;
return count(n,sqLeft-1,bLeft-1,wLeft,count,b);
}
}else if(y==n-1){
if((x==0?true:b[x-1][y-1]!=1)&&(x==n-1?true:b[x+1][y-1]!=1)){
int[][] c=new int[n][n];
for(int i = 0; i < n; i++){
System.arraycopy(b[i], 0, c[i], 0, n);
}
b[x][y]=2;
c[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,c)+count(n,sqLeft-1,bLeft-1,wLeft,count,b);
} else {
b[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,b);
}
}else{
if(((x==0?true:b[x-1][y-1]!=1)&&(x==n-1?true:b[x+1][y-1]!=1))&&((x==0?true:b[x-1][y+1]!=2)&&(x==n-1?true:b[x+1][y+1]!=2))){
int[][] c=new int[n][n];
for(int i = 0; i < n; i++){
System.arraycopy(b[i], 0, c[i], 0, n);
}
b[x][y]=2;
c[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,c)+count(n,sqLeft-1,bLeft-1,wLeft,count,b);
} else if ((x==0?true:b[x-1][y-1]!=1)&&(x==n-1?true:b[x+1][y-1]!=1)){
b[x][y]=2;
return count(n,sqLeft-1,bLeft-1,wLeft,count,b);
} else if ((x==0?true:b[x-1][y+1]!=2)&&(x==n-1?true:b[x+1][y+1]!=2)){
b[x][y]=1;
return count(n,sqLeft-1,bLeft,wLeft-1,count,b);
} else {
return 0;
}
}
}
}
}
এখানে চেষ্টা করে দেখুন (আইডিয়নের পক্ষে দ্রুত পর্যায়ে দৌড়াবেন না যাতে শেষ মানটি প্রিন্ট না করে, আমার সমাধানটি খুব ভাল লাগে না বলে মনে হচ্ছে!)