Java(1065バイト)
import java.util.*;public class W{public static void main(String[]a){new
W(Integer.parseInt(a[0]),Integer.parseInt(a[1]));}W(int w,int h){M
H=new M(),V=new M();String L;int i,j,l,m,n=w*h,p[]=new int[n];long
I,J,K,M,C=31;long[]G=new long[h],T=new long[w],W[]=new long[n][],X;try{Scanner
S=new Scanner(new java.io.File("words.txt"));while(0<1){L=S.nextLine();l=L.length();for(i=0;i>>l<1;i++){K=0;for(j=0;j<l;j++)K+=(i>>j&1)*(L.charAt(j)-96L)<<5*j;if(l==w)H.put(K,H.g(K)+1);if(l==h)V.put(K,V.g(K)+1);}}}catch(Exception
E){}while(n-->0){j=1;if(W[n]==null){M=1L<<62;for(i=w*h;i-->0;){m=i/w;l=i%w*5;if((G[m]>>l&C)<1){X=new
long[27];I=K=0;for(;K++<26;){J=H.g(G[m]+(K<<l))*V.g(T[i%w]+(K<<5*m));X[(int)K]=K-32*J;I+=J;}if(I<1)j=0;if(I<M){M=I;p[n]=i;W[n]=X;}}}}X=W[n];Arrays.sort(X);M=X[0]*j;X[0]=0;K=M&C;i=p[n]%w;j=p[n]/w;l=5*i;m=5*j;G[j]&=~(C<<l);G[j]+=K<<l;T[i]&=~(C<<m);T[i]+=K<<m;if(M>=0){W[n]=null;n+=2;}}for(long
A:G){L="";for(i=0;i<w;)L+=(char)(96+(C&A>>5*i++));System.out.println(L);}}class
M extends HashMap<Long,Long>{long g(Long s){return get(s)!=null?get(s):0;}}}
最短になるには長い道のりですが、タイミングの制約を満たすのに最も近いと思います。入力ファイルが適切な長さの単語にフィルターされていると想定して、14バイトを節約しました。私のネットブックでは、全体をフィードする場合words.txt
、最初の1分間を費やして前処理を行い、生成したもののほとんどを破棄します。その後、7x7を解くのにわずか20秒ほどかかります。私のデスクトップでは、15秒未満ですべてが実行され、次のようになります。
rascals
areolae
serrate
coroner
alanine
latents
seeress
8x7または8x8の解決策を見つけることなく、50時間以上実行しました。8文字の単語は、この問題の重要な境界線のように見えます-それは、あまり進歩せずに半分いっぱいにホバリングするだけです。
使用されるアプローチは、完全なピボットであり、可能な水平補完の数に垂直補完の数を掛けたものに基づくヒューリスティックです。たとえば、中間グリッドがある場合
*ean*
algae
*ar**
*ier*
*nee*
次に、左上隅にヒューリスティック値を指定しcount(aean*)count(aa***) + count(bean*)count(ba***) + ... + count(zean*)count(za***)
ます。すべてのセルの中で、ヒューリスティック値が最も小さい(つまり、満足させるのが難しい)セルを選択し、そのセルのヒューリスティック値に寄与した量の降順で(つまり、成功する可能性が最も高いセルから)文字を処理します。 )。