【YBT高効率アドバンスト】1基本アルゴリズム/ 4深さ優先探索/ 2数独ゲーム

【YBT高効率アドバンスト】1基本アルゴリズム/ 4深さ優先探索/ 2数独ゲーム

メモリ制限:256 MiB
制限時間:1000ミリ秒
標準入出力
質問タイプ:従来の
評価方法:テキスト比較

タイトル説明

数独は伝統的なパズルゲームです、あなたは9 ∗ 9 9 * 9を置く必要があります99の数独が完成したので、図のすべての行、すべての列、すべての3 ∗ 3 3 * 333の9つの正方形グリッドの数1− 9 1-919つすべてが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;
}

おすすめ

転載: blog.csdn.net/weixin_46975572/article/details/115182274