फिलोमिनो सॉल्वर


20

Fillomino एक पहेली है जहाँ आप के साथ एक ग्रिड को भरने है polyominoes । प्रत्येक Polyomino सन्निहित कोशिकाओं के एक क्षेत्र है। ग्रिड प्रतिनिधित्व शो क्या आकार Polyomino प्रत्येक कोशिका को कवर किया जाता है। उदाहरण के लिए, एक पैंटोमिनो (5) को 5पांच सन्निहित कोशिकाओं (नीचे देखें) में से प्रत्येक में दिखाया जाएगा । एक ही आकार के दो पॉलोमिनोइन एक सीमा साझा नहीं कर सकते हैं, लेकिन तिरछे सीमा कर सकते हैं।

प्रत्येक पहेली के लिए, आपको बहुत से गिवेन के साथ शुरू किया जाता है और शेष कोशिकाओं में भरना चाहिए। एक आसान उदाहरण पहेली और समाधान:

नमूना fillomino पहेली

आपका काम: एक वर्ग पहेली को देखते हुए यह और आउटपुट जवाब का समाधान। इनपुट स्टडिन, एक कमांड लाइन तर्क, या पाठ फ़ाइल के माध्यम से हो सकता है। इनपुट एक पूर्णांक के रूप में दी जाएगी 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

याद रखें कि कुछ पॉलीमिनो में कोई संख्या नहीं है, और कुछ में एक से अधिक हैं। है गिवेंस की संख्या और polyominoes की संख्या के बीच एक-से-एक संबंध।

स्कोर मानक कोड गोल्फ, बाइट में कार्यक्रम का आकार है।


यदि यह 9x9 बोर्ड के लिए काम करता है, लेकिन एक पुनरावर्ती दृष्टिकोण एक वैध उत्तर है, लेकिन कुछ बड़े आकार के बोर्ड के लिए मेमोरी से बाहर चलेगा?
trichoplax

1
हां.मैं आप करने में सक्षम होने की उम्मीद नहीं है feasibly एक 31x31 या कुछ भी चलाते हैं। बस इतना है कि आप कर सकते हैं वास्तव में ऊपर दोनों 5x5 और 9x9 चलाने (परीक्षण मामलों के लिए उत्पादन देने के लिए), और होगा सैद्धांतिक रूप से एक ही एल्गोरिथ्म (संसाधनों का एक बकवास टन दिया गया है) के साथ बड़ा के लिए काम करते हैं।
जोबिट्स

जवाबों:


4

4882 वर्ण - जावा

नहीं एक बहुत golfed समाधान (यानी 4800 वर्ण एक lotttttttttttt है) एक सा है कि 1 या 2 डिबग printlines में अधिक golfed जा सकता है में अब भी कर रहे हैं। मुझे लगता है कि मैं बेकार / अनुकूलित कोड के मामले में अभी भी काफी कम कर सकता हूं।

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. हो सकता है कि जल्द ही इसे लगाने की कोशिश करें।


1
आप इसे कैसे संकलित कर रहे हैं? मुझे कुछ स्थानों पर डुप्लिकेट चर त्रुटियाँ मिल रही हैं।
Geobits
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.