필로 미노 솔버


20

Fillomino폴리오 미노 로 그리드를 채우는 퍼즐 입니다. 각각의 폴리 아미노는 인접한 세포의 영역이다. 그리드 표현은 각 셀을 덮고있는 polyomino 크기를 보여줍니다. 예를 들어, pentomino (5)는 55 개의 인접 셀 각각에서와 같이 표시됩니다 (아래 참조). 크기가 같은 두 개의 폴리 아미노는 테두리를 공유 할 수 없지만 대각선으로 테두리가있을 수 있습니다.

각 퍼즐에 대해, 당신은 많은 주어진 것으로 시작 하고 나머지 셀을 채워야합니다. 쉬운 예제 퍼즐 및 솔루션 :

샘플 필로 미노 퍼즐

당신의 작업 : 사각형 퍼즐이 주어지면 그것을 풀고 답을 출력하십시오. 입력은 stdin, 단일 명령 행 인수 또는 텍스트 파일을 통해 이루어질 수 있습니다. 입력 값은 정수로 표시 n되고 그 뒤에 숫자 nn표시됩니다. 빈 셀은 마침표 ( .) 로 제공됩니다 . 위의 퍼즐 예를 들면 다음과 같습니다.

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

출력은 콘솔이나 텍스트 파일 nn숫자 줄로 주어진 해결 된 퍼즐입니다 .

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

일부 폴리 노 미노에는 숫자 가 없고 , 일부는 하나 이상이 있습니다. 주어진 수와 폴리오 미노 수 사이에는 일대일 관계 가 없습니다 .

점수는 표준 코드 골프, 프로그램 크기 (바이트)입니다.


재귀 접근 방식이 9x9 보드에서는 작동하지만 더 큰 크기의 보드에서는 메모리가 부족한 경우 올바른 대답입니까?
trichoplax

1
그래요 당신이 할 수 있기를 기대하지 않는 실행 가능하게 31x31 또는 아무것도를 실행합니다. 그냥 그래서 당신이 할 수있는 사실은 위의 5 × 5와 9 × 9를 모두 실행 (테스트 케이스의 출력을 제공하기 위해), 그리고 것 이론적으로 (자원 쓰레기 톤을 부여) 같은 알고리즘을 큰위한 작업.
Geobits

답변:


4

4882 자-Java

매우 골프 솔루션이 아닙니다 (즉, 4800 문자는 lotttttttttttt입니다) 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("");}}}

이 전에 Polyominoes를 본 적이 없어서, 나는 그들이 무엇인지에 대해 읽었고, 방언을 풀지 않고 방금 내 자신을 구성했습니다 (quite slow).

기본적으로 재귀를 많이 사용합니다 ... 불완전한 Polyomino를 찾아서 완성하려고합니다. 빈 공간을 찾고, 포켓의 모든 사각형을 통해 루프 1-9를 그 포켓을 해당 값으로 설정합니다. 포켓이 완성되면 다른 포켓을 찾은 다음 끝날 때까지 반복합니다. 9 크기의 그리드에서 작동하지 못했습니다 ... 9 시간 동안 합리적인 시간 내에 작동 할 수있는 최적화를 하나 이상 염두에두고 있습니다.


1
이것을 어떻게 컴파일하고 있습니까? 몇 군데에서 중복 변수 오류가 발생합니다.
Geobits
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.