ফিলোমিনো সলভার


20

ফিলোমিনো এমন একটি ধাঁধা যেখানে আপনি পলিওমিনোস দিয়ে একটি গ্রিড পূরণ করেন । প্রতিটি পলিওমিনো হ'ল কোষের একটি ক্ষেত্র। গ্রিডের উপস্থাপনাটি দেখায় যে প্রতিটি কক্ষটি কী আকারের পলিওমিনোকে আচ্ছাদন করে। উদাহরণস্বরূপ, একটি পেন্টোমিনো (5) 5প্রতিটি পাঁচটি স্বতন্ত্র কোষের মতো দেখানো হবে (নীচে দেখুন)। একই আকারের দুটি পলিওমিনোস একটি সীমানা ভাগ করতে পারে না, তবে ত্রিভুজ সীমানা করতে পারে।

প্রতিটি ধাঁধা জন্য, আপনি একটি নম্বর দিয়ে শুরু করছি givens এবং অবশিষ্ট কোষে পূরণ করতে হবে। একটি সহজ উদাহরণ ধাঁধা এবং সমাধান:

নমুনা ফিলোমিনো ধাঁধা

আপনার টাস্ক: একটি বর্গ ধাঁধা দেওয়া, এটি সমাধান করুন এবং উত্তর আউটপুট করুন। ইনপুট স্টিডিনের মাধ্যমে হতে পারে, একটি একক কমান্ড লাইন আর্গুমেন্ট বা পাঠ্য ফাইল। ইনপুটটি পূর্ণসংখ্যা হিসাবে দেওয়া হবে এবং nতারপরে প্রতিটি অঙ্কের nরেখা থাকবে n। খালি সেলগুলি পিরিয়ড ( .) হিসাবে দেওয়া হবে । উপরের উদাহরণ ধাঁধার জন্য, এটি হবে:

5
3..66
5.4.6
.54.6
.1.6.
..312

আউটপুট হ'ল সমাধান ধাঁধা, অঙ্কের nলাইনে প্রদত্ত nকনসোল বা পাঠ্য ফাইলকে:

33366
55446
55466
51462
33312

ধাঁধাটি বৈধ না হলে আউটপুট 0। একটি ধাঁধাটি যদি অবৈধ হতে পারে তবে ইনপুটটি ত্রুটিযুক্ত বা কোনও সমাধান নেই। যদি একাধিক সমাধান থাকে তবে আপনি যে কোনও একটি বা সমস্ত আউটপুট পেতে পারেন।

যেহেতু প্রতিটি ঘর একক অঙ্ক দ্বারা প্রতিনিধিত্ব করা হয়, সমস্ত ধাঁধাটি পলিওমিনোজের আকার 9এবং কেবল এর অধীনে থাকবে। যদি বৃহত্তর পলিওমিনোসগুলি ছাড়া সমাধান করা সম্ভব না হয় তবে এটি অবৈধ বিবেচনা করুন।

বৈধ উত্তরগুলি পরীক্ষার ক্ষেত্রে কেবল আউটপুট সমাধান নয়, প্রদত্ত ধাঁধা সমাধান করবে । কোনও বাহ্যিক সংস্থান নয়, তা অনলাইনে বা স্থানীয় হোক। যদি সেটা হয় একটি বিল্ট-ইন fillomino সমাধান ফাংশন, আপনি এটি ব্যবহার করতে পারবেন না সঙ্গে একটি ভাষা হতে। সংক্ষেপে, মেলা খেলুন

পরীক্ষা ক্ষেত্রে:

ইনপুট:

9
..21.3..5
.5...5..5
.1.44.334
...53.4..
2.3.3..5.
1.15.5.15
..45..1..
.24.53.53
....2....

আউটপুট (একটি সম্ভাব্য সমাধান):

322133315
355445555
315443334
235531444
233135551
141535515
344553155
324553553
321223133

মনে রাখবেন যে কয়েকটি পলিওমিনোজের কোনও নির্দিষ্ট নম্বর নেই, এবং কিছুতে একাধিক রয়েছে। নেই না givens সংখ্যা এবং polyominoes সংখ্যার মধ্যে একটি এক-এক সম্পর্ক।

স্কোর হ'ল স্ট্যান্ডার্ড কোড-গল্ফ, বাইটে প্রোগ্রামের আকার।


যদি একটি 9x9 বোর্ডের জন্য কাজ করে তবে কিছু বড় আকারের বোর্ডের স্মৃতিশক্তি চলে যায় তবে কি কোনও পুনরাবৃত্তির পদ্ধতির কোনও কার্যকর উত্তর?
ট্রাইকোপলাক্স

1
হ্যাঁ.আমি আশা করি না আপনি সম্ভবত 31x31 বা কিছু চালাতে সক্ষম হবেন । শুধু যাতে আপনি করতে পারেন আসলে উপরে উভয় 5x5 এবং 9x9 চালানো (পরীক্ষার বিষয় জন্য আউটপুট দিতে), এবং would তাত্ত্বিক একই আলগোরিদিম (সম্পদের একটি বিষ্ঠা টন দেওয়া) সঙ্গে বৃহত্তর জন্য কাজ করি।
জিওবিটস

উত্তর:


4

4882 টি অক্ষর - জাভা

খুব গল্ফযুক্ত সমাধান নয় (উদাহরণস্বরূপ 4800 অক্ষরগুলি একটি লটট্যাটিট্টেটস) যে 1 বা 2 ডিবাগ প্রিন্টলাইনগুলি এখনও আছে সেখানে কিছুটা বেশি গল্ফ করা যায়। আমি মনে করি আমি বেহুদা / অপ্টিমাইজড কোডের ক্ষেত্রে এখনও বেশ কিছুটা কমাতে পারি।

import java.util.*;import java.awt.Point;public class G{public static void main(String[]args){new G();}Scanner z=new Scanner(System.in);public G(){s=z.nextInt();z.nextLine();int g[][]=new int[s][s];for(int i=0;i<s;i++)Arrays.fill(g[i],-1);for(int i=0;i<s;i++){String line=z.nextLine();for(int j=0;j<s;j++)if(line.charAt(j)!='.')g[i][j]=Integer.parseInt(Character.toString(line.charAt(j)));}System.out.println();if(y(g)){for(int i=0;i<s;i++)for(int j=0;j<s;j++)System.out.print(g[i][j]);System.out.println();}else System.out.println(0);}private boolean x(Collection<Point>c,int[][]d){if(c.size()==0)return true;int j=0;for(Iterator<Point>k=c.iterator();k.hasNext();k.next(),j++){for(int sol=9;sol>=0;sol--){int[][]a=new int[s][s];for(int i=0;i<s;i++)a[i]=Arrays.copyOf(d[i],s);List<Point>b=new ArrayList<Point>();for(Point p:c)if(!b.contains(p))b.add(new Point(p));a[b.get(j).x][b.get(j).y]=sol;if(w(a,b.get(j))){if(x(b,a)){for(int i=0;i<s;i++)d[i]=Arrays.copyOf(a[i],s);c.clear();c.addAll(b);return true;}}}}return false;}int s;private boolean y(int[][]d){int[][] a=new int[s][s];for (int i = 0; i<s;i++)a[i]=Arrays.copyOf(d[i],s);List<Point> incomplete=new ArrayList<Point>();if(r(a)&&s(a)){a(a);System.exit(0);}else if(!r(a)){q("INVALID FROM MAIN, ",12);return false;}for(int i=0;i<s;i++)for(int j=0;j<s;j++){if(a[i][j]!=-1)if(t(new Point(i,j),a,null,a[i][j]).size()!=a[i][j]){if(w(a,new Point(i,j))){a(a);if(y(a)){for(int i=0;i<s;i++)d[i]=Arrays.copyOf(a[i],s);return true;}else return false;}else return false;}}for(int i=0;i<s;i++)for(int j=0;j<s;j++)if(a[i][j]==-1){Set<Point>c=t(new Point(i,j),a,null,-1);if(x(c,a)){if(y(a)){for(int i=0;i<s;i++)d[i] = Arrays.copyOf(a[i], s);return true;}else return false;}else return false;}q("How did you get here",1);return false;}private boolean w(int[][]d,Point b){List<Point>c;Set<Point>a;a=t(b,d,null,d[b.x][b.y]);c=new ArrayList<Point>(u(b,d,null,d[b.x][b.y]));int h=d[b.x][b.y];int g=h-a.size();if(c.size()<g){return false;}else if(v(c,h,h,new ArrayList<Point>(a),0,d))return true;else return false;}private boolean v(List<Point>c,int h,int g,List<Point>e,int f,int[][]d){if(e==null)e=new ArrayList<Point>();int[][]a=new int[s][s];for(int i=0;i<s;i++)for(int k=0;k<s;k++)a[i][k]=d[i][k];if(f<g&&e.size()<g){for(int i=0;i<c.size();i++){if(!e.contains(c.get(i))){if(d[c.get(i).x][c.get(i).y]==h){for(Point c:e){a[c.x][c.y]=h;}Set<Point> u=t(e.get(0),a,null,h);Set<Point>v=t(c.get(i),a,null,h);if(!Collections.disjoint(u,v)){u.addAll(v);List<Point>uList=new ArrayList<Point>(u);if(v(c,h,g,uList,f+1,a)){q("this e sucess",2);if(y(d)){e.addAll(uList);return true;}}else;}for(int l=0;l<s;l++)for(int k=0;k<s;k++)a[l][k]=d[l][k];}else if(e.add(c.get(i))){if(v(c,h,g,e,f+1,d)){q("this e sucess",2);if(y(d))return true;}}if(e.contains(c.get(i)))e.remove(c.get(i));}}return false;}else if(f>g||e.size()>g){if(f>g){q("Your over the g. ");return false;}else return false;}else{for(Point c:e){a[c.x][c.y]=h;}if(r(a)){if(y(a)){for(int i=0;i<s;i++)d[i]=Arrays.copyOf(a[i],s);q("complete(a) is true, ",4);return true;}else{return false;}}else{return false;}}}private void q(String out,int i){System.err.println(out+". exit code: "+i);System.exit(i);}private void q(String a){q(a,0);}private boolean r(int[][] d){for(int i=0;i<s;i++)for(int j=0;j<s;j++)if(d[i][j]!=-1){Set<Point>same=t(new Point(i,j),d,null,d[i][j]);if(same.size()>d[i][j]){return false;}Set<Point>fae=u(new Point(i,j),d,null,d[i][j]);if(u(new Point(i,j),d,null,d[i][j]).size()<d[i][j]){return false;}}return true;}private Set<Point> u(Point p,int[][]d,Set<Point>u,int i){u=(u==null)?new HashSet<Point>():u;if(d[p.x][p.y]==i||d[p.x][p.y]==-1)u.add(p);int x=p.x,y=p.y;Point t=new Point();if(x+1<s&&(d[x+1][y]==i||d[x+1][y]==-1)){if(u.add(new Point(x+1,y)))u=u(new Point(x+1,y),d,u,i);}if(y+1<s&&(d[x][y+1]==i||d[x][y+1]==-1)){if(u.add(new Point(x,y+1)))u=u(new Point(x,y+1),d,u,i);}if(x-1>=0&&(d[x-1][y]==i||d[x-1][y]==-1)){if(u.add(new Point(x-1,y)))u=u(new Point(x-1,y),d,u,i);}if(y-1>=0&&(d[x][y-1]==i||d[x][y-1]==-1)){if(u.add(new Point(x,y-1)))u=u(new Point(x,y-1),d,u,i);}return u;}private Set<Point> t(Point p,int[][]d,Set<Point>u,int i){u=(u==null)?new HashSet<Point>():u;if(d[p.x][p.y]==i)u.add(p);int x=p.x,y=p.y;Point t=new Point(p);if(x+1<s&&d[x+1][y]==i){if(u.add(new Point(x+1,y)))u=t(new Point(x+1,y),d,u,i);}if(y+1<s&&d[x][y+1]==i){if(u.add(new Point(x,y+1)))u=t(new Point(x,y+1),d,u,i);}if(x-1>=0&&d[x-1][y]==i){if(u.add(new Point(x-1,y)))u=t(new Point(x-1,y),d,u,i);}if(y-1>=0&&d[x][y-1]==i){if(u.add(new Point(x,y-1)))u=t(new Point(x,y-1),d,u,i);}return u;}private boolean s(int[][]d){for(int i=0;i<s;i++)for(int j=0;j<s;j++)if(t(new Point(i,j),d,null,d[i][j]).size()!=d[i][j])return false;return true;}private void a(int[][]d){for(int i=0;i<s;i++){for(int j=0;j<s;j++){System.out.printf("%1s",d[i][j]==-1?".":Integer.toString(d[i][j]));}System.out.println("");}}}

এর আগে পলিওমিনোসটি আগে কখনও দেখেনি, আমি সেগুলি পড়েছি এবং অ্যালরোজিথগুলি সমাধান না করে কেবল আমার নিজের তৈরি (বেশ ধীর))

মূলত, প্রচুর পুনরাবৃত্তি ব্যবহার করে ... একটি পলিওমিনো খুঁজে পাওয়া যায় যা অসম্পূর্ণ, এটি সম্পূর্ণ করার চেষ্টা করে। একটি খালি জায়গা সন্ধান করে, পকেটের সমস্ত স্কোয়ারের মধ্য দিয়ে 1-9 লুপ করে, সেই পকেটটিকে সেই মানটিতে সেট করে। পকেটটি সম্পূর্ণ হয়ে গেলে, এটি অন্য পকেটটি সন্ধান করার চেষ্টা করে, তারপর শেষ না হওয়া পর্যন্ত পুনরাবৃত্তি করে। আমি এটি 9 মাপের গ্রিডের জন্য কাজ করতে পারি না ... আমার মনে মনে একটি কমপক্ষে একটি অপ্টিমাইজেশন রয়েছে যা এটি 9 এর জন্য একটি যুক্তিসঙ্গত সময়ের মধ্যে কাজ করতে পারে soon


1
আপনি কিভাবে এটি সংকলন করছেন? আমি কয়েকটি জায়গায় সদৃশ ভেরিয়েবল ত্রুটি পাচ্ছি।
জিওবিটস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.