数独
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/11/10(土) 23:46:20http://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一題解くのに0.01秒なら1000万秒かかる
3000時間だ 2ちゃんねらが100人でやれば30時間
0003デフォルトの名無しさん
2007/11/11(日) 06:17:280004デフォルトの名無しさん
2007/11/11(日) 06:48:010005デフォルトの名無しさん
2007/11/11(日) 06:51:44数字nの個数をk(n)とすると、k(1)>=・・・>=k(n)>=1
k(1)+・・・+k(n)=16としてよいな
0006デフォルトの名無しさん
2007/11/11(日) 07:04:25これを求めてから16個のみ残せば出来上がるがその数は上の数字をうわまわるきがするな
全配置は求められそうにないな
0007デフォルトの名無しさん
2007/11/11(日) 07:06:46全配置が無理でもたまたま16個の配置が解ける可能性はあるからな
0008デフォルトの名無しさん
2007/11/11(日) 07:18:4416個の配置がいくつ以内か求められるな
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例えば、1〜9の個数が2、2、2、2、2、2、2、1、1とすると
数字の1を配置するだけで約2000通りあるから
2000の7乗 * 80の2乗程度の配置がある
8× 10^26とおり程度
■ このスレッドは過去ログ倉庫に格納されています