トップページ⇒tech
10コメント3KB

数独

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/11/10(土) 23:46:20
16個の数字の数独を計算するスレ

http://ara.moo.jp/puz/sudoku.htm
http://www.geocities.jp/master_mishichan/index.html
http://karetta.jp/book-node/puzzle-generator-age/009176
http://www10.plala.or.jp/t_itokin/HowToSolve.html
0002デフォルトの名無しさん2007/11/10(土) 23:51:30
16個の配置はいくつあるのか不明だが10億位だと
一題解くのに0.01秒なら1000万秒かかる
3000時間だ 2ちゃんねらが100人でやれば30時間
0003デフォルトの名無しさん2007/11/11(日) 06:17:28
http://www.doorgod.org/sudoku/
0004デフォルトの名無しさん2007/11/11(日) 06:48:01
16個の初期配置の数独があるか判別したい
0005デフォルトの名無しさん2007/11/11(日) 06:51:44
16個の初期配置を全て求めるプログラムはどう作る?

数字nの個数をk(n)とすると、k(1)>=・・・>=k(n)>=1
k(1)+・・・+k(n)=16としてよいな
0006デフォルトの名無しさん2007/11/11(日) 07:04:25
回転や入替などの重複を除いて数えると、終局の局面数は5,472,730,538 通りだそうだ
これを求めてから16個のみ残せば出来上がるがその数は上の数字をうわまわるきがするな
全配置は求められそうにないな
0007デフォルトの名無しさん2007/11/11(日) 07:06:46
仕方ないので、解く速度が速いプログラムを開発しよう
全配置が無理でもたまたま16個の配置が解ける可能性はあるからな
0008デフォルトの名無しさん2007/11/11(日) 07:18:44
数字1の個数が1〜9個のみの配置がいくつあるか計算できれば
16個の配置がいくつ以内か求められるな
1つなら81通り、 2つなら81*(81-20)通り、 3つなら・・・と求める

k(1)>=・・・>=k(n)>=1 k(1)+・・・+k(n)=16を満たす全てのペアに対して
上で計算した値を掛け合わせて和を計算すれば配置の上限が決まるな
0009デフォルトの名無しさん2007/11/11(日) 10:36:25
これあってる? 一つの数字だけの配置数
#include <iostream>
using namespace std;
main(){
int x[81],i[9],d=0,k,cnt=0,j;

#define up(d,c) { \
int m=i[d]/9; int n=i[d]%9;int l=27*(m/3)+3*(n/3); \
for(j=0;j<9;j++){x[9*m+j]+=c; x[9*j+n]+=c; x[l+9*(j/3)+j%3]+=c;}}

for(k=1;k<=9;k++){
i[0]=0;cnt=0;for(j=0;j<81;j++)x[j]=0;
for(;;){
if(x[i[d]]==0){
if(d>=k-1)cnt++;
else{up(d,1);i[d+1]=i[d]+1;d++;continue;}}

for(;;){
if(i[d]<80){i[d]++;break;}
if(d==0){cout<<k<<" 個の配置数 "<<cnt<<endl;goto end;}
d--;up(d,-1);}}
end:}}
0010デフォルトの名無しさん2007/11/11(日) 10:56:48
16個の配置を求めるのは無理そうだな
例えば、1〜9の個数が2、2、2、2、2、2、2、1、1とすると
数字の1を配置するだけで約2000通りあるから
2000の7乗 * 80の2乗程度の配置がある 
8× 10^26とおり程度 
■ このスレッドは過去ログ倉庫に格納されています