Fillomino Çözücü


20

Fillomino Eğer bir ızgara doldurmak bir bulmaca Polyominoes . Her poliomino bitişik hücrelerin bir alanıdır. Izgara temsili, her bir hücreyi hangi boyutta poliomino kapladığını gösterir. Örneğin, 5beş bitişik hücrenin her birinde olduğu gibi bir pentomino (5) gösterilecektir (aşağıya bakınız). Aynı büyüklükteki iki polinom, bir sınırı paylaşamaz, ancak çapraz olarak sınırlanabilir.

Her bulmaca için bir dizi hediye ile başlarsınız ve kalan hücreleri doldurmanız gerekir. Kolay bir örnek bulmaca ve çözüm:

yapboz örnek fillomino

Senin görevin: Kare bir bulmaca verilen, çözmek ve cevap çıktı. Giriş stdin, tek bir komut satırı argümanı veya metin dosyası yoluyla olabilir. Girdi bir tamsayı olarak verilir n, ardından nhatları nHer bir basamak. Boş hücreler nokta ( .) olarak verilecektir . Yukarıdaki örnek bulmaca için:

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

Çıktı, basamak nsatırlarında nkonsol veya metin dosyasına verilen çözülmüş bulmacadır :

33366
55446
55466
51462
33312

Bulmaca geçerli değilse çıktı alın 0. Giriş hatalı biçimlendirilmişse veya bir çözüm yoksa bir bulmaca geçersiz olabilir. Birden fazla çözüm varsa, bunların herhangi birini veya hepsini çıktısını alabilirsiniz.

Her hücre tek bir rakamla temsil edildiğinden, tüm bulmacalar poliomino boyutunda 9ve sadece altında olacaktır . Daha büyük poliominolar olmadan çözülemezse, geçersiz olduğunu düşünün.

Geçerli cevaplar, test senaryolarına sadece çıktı çözümleri değil, verilen herhangi bir bulmacayı çözecektir . Çevrimiçi veya yerel harici kaynak yok. Orada ise olur yerleşik Fillomino çözme fonksiyonu, bunu bir kullanamazsınız ile bir dil olması. Kısacası, adil oynayın .

Test durumu:

Giriş:

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....

Çıktı (olası bir çözüm):

322133315
355445555
315443334
235531444
233135551
141535515
344553155
324553553
321223133

Bazı polyominoes var unutmayın hiçbir verilen sayı ve bazı Birden fazla var. Orada değil verili sayısı ve Polyominoes sayısı arasında bire bir ilişki.

Skor standart kod golf, programın bayt cinsinden boyutu.


Yinelemeli bir yaklaşım, 9x9'luk bir kart için çalışıyor ancak daha büyük boyutlu bir kart için bellek tükenecekse geçerli bir cevap mıdır?
trichoplax

1
Yes.I sen muktedir beklemeyin fizibil bir 31x31 ya da bir şey çalıştırın. Sadece bu yüzden ki aslında yukarıda 5x5 ve 9x9 hem çalıştırın (test durumları için çıkış vermek) ve yatak teorik olarak (kaynakların bir bok-ton verilmiş) aynı algoritma ile daha büyük için çalışır.
Geobits

Yanıtlar:


4

4882 karakter - Java

Çok golf değil bir çözüm (yani 4800 karakter bir lotttttttttttt) 1 veya 2 hata ayıklama printlines hala orada olduğundan biraz daha golf olabilir. Sanırım işe yaramaz / optimize edilmiş kod açısından adil bir miktar azaltabilirim.

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("");}}}

Bundan önce Polyominoes'u hiç görmedim, ne olduklarını ve sadece kendimden oluşan (oldukça yavaş) alrogitmleri çözmeden baktım.

Temel olarak, özyineleme çok kullanır ... Eksik olan bir Polyomino bulur, onu tamamlamaya çalışır. Boş bir boşluk bulur, cebinizdeki tüm kareler arasında 1-9 arası döngüler yapar, bu cebi bu değere ayarlar. Cep tamamlanırsa, başka bir cep bulmaya çalışır, daha sonra bitene kadar tekrar eder. Ben 9 büyüklüğünde bir ızgara için çalışmak için alamadım ... aklıma 9 için makul bir süre içinde çalışmasını sağlayabilecek en az bir optimizasyon var. Yakında bunu koymak için çalışabilirsiniz.


1
Bunu nasıl derliyorsunuz? Birkaç yerde yinelenen değişken hataları alıyorum.
Geobits
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.