【YBT高効率アドバンスト】1基本アルゴリズム/ 4深さ優先探索/ 2数独ゲーム
メモリ制限:256 MiB
制限時間:1000ミリ秒
標準入出力
質問タイプ:従来の
評価方法:テキスト比較
タイトル説明
数独は伝統的なパズルゲームです、あなたは9 ∗ 9 9 * 9を置く必要があります9∗9の数独が完成したので、図のすべての行、すべての列、すべての3 ∗ 3 3 * 33∗3の9つの正方形グリッドの数1− 9 1-91−9つすべてが1回だけ表示されます。
数独を記入するプログラムを書いてください。
入力フォーマット
入力には、複数のテストケースのセットが含まれています。
各テストケースは1行を占め、81文字を含み、数独の81セルでデータを表現します(全体の順序は上から下、同じ行は左から右です)。
各文字は数字または「。」です(入力されていないことを示します)。
入力内の各パズルには1つの解決策しかないと想定できます。
ファイルの終わりにendという単語を含む1行は、入力の終わりを示します。
出力フォーマット
テストケースごとに、入力された数独を表す1行のデータが出力されます。
サンプル
サンプル入力
4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......
......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3.
end
サンプル出力
417369825632158947958724316825437169791586432346912758289643571573291684164875293
416837529982465371735129468571298643293746185864351297647913852359682714128574936
アイデア
3つの配列を使用して、各行と列のデジタル使用量を保存します。
深さ優先探索
答えを見つけ、マークを付けて、終了します。
コード
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
string str;
int h[9],l[9],g[9],x[82],y[82],z[82],w[82],num[513],s[513],tot,m[10]={
1,2,4,8,16,32,64,128,256,512};
bool d;
void DFS(int dep)
{
int bit,tem,mn=100000000,wz,i;
if(dep>tot)
{
cout<<str<<endl;
d=1;
return;
}
for(i=1; i<=tot; i++)
if(str[w[i]]=='.'&&s[h[x[i]]&l[y[i]]&g[z[i]]]<=mn)
{
wz=i,mn=s[h[x[i]]&l[y[i]]&g[z[i]]];
if(mn==0)return;
}
for(bit=h[x[wz]]&l[y[wz]]&g[z[wz]]; bit; bit-=tem)
{
tem=bit&-bit,h[x[wz]]^=tem,l[y[wz]]^=tem,g[z[wz]]^=tem,str[w[wz]]=num[tem]+'0';
DFS(dep+1);
if(d)return;
h[x[wz]]^=tem,l[y[wz]]^=tem,g[z[wz]]^=tem;
}
str[w[wz]]='.';
return;
}
int main()
{
int i,tem;
ios::sync_with_stdio(false);
memset(s,0,sizeof(s));
for(i=0; i<9; i++)num[m[i]]=i+1;
for(i=0; i<512; i++)
for (tem=i; tem; tem-=tem&-tem,s[i]++);
for(cin>>str; str!="end"; cin>>str)
{
for(i=0; i<9; i++)
h[i]=l[i]=g[i]=511;
for(tot=0,d=0,i=0; i<81; i++)
if(str[i]=='.') w[++tot]=i,x[tot]=i/9,y[tot]=i%9,z[tot]=x[tot]/3*3+y[tot]/3;
else h[i/9]^=m[str[i]-49],l[i%9]^=m[str[i]-49],g[i/27*3+(i%9)/3]^=m[str[i]-49];
DFS(1);
}
return 0;
}