NOIP 2009] [ターゲット型の数独

NOIP 2009] [ターゲット型の数独

タイトル

タイトル説明

Xiaohuaは小さな町であり、良好な数学の学生を愛し、最近、それらはすべて、彼らは科学的な数独を進めたい積極的な、数独と恋に落ちました。しかし、通常の数独は、彼らは博士Z尋ねるので、博士Z「は、ターゲット型の数独」彼の最近の発明、テスト対象として、2人の子供を連れ出し、彼らのためにあまりにも簡単です。

別の正方形の数が広い小さな四角形(太い黒線では、離間)のユニークな、高9つの3×3グリッドセル9×9細胞広い、大きな四角でハイレベルとして平均数と目標形状。この大きな正方形では、いくつかの図は、これらの図によれば、論理的な推論を使用することが知られている11-9他の空間に数9を入力します。各番号は小さな正方形の各々で繰り返すことができない、各行の各数値は、各列を繰り返すことができません。しかし、固有のビット目標状ソールの数と異なる、すなわちの平均数、各正方形は、スコアを有する、等ターゲットとして、近い中心からより高いスコア。(AS)

ここに画像を挿入説明

特定分布に図スコア:最も内側の1セル(黄色領域)は、各グリッドの10分、円の外側黄色領域(レッドゾーン)9分で、次いで外側の円(青色領域)各グリッド8点、青色領域(領域茶色)外側の円に示すように7分の各グリッド、各格子点6の最外円(白色面積)。ゲームの要件:一人一人が、与えられた数独を完了する必要がありますが(それぞれ与えられた数独は異なるfillメソッドを有していてもよい)が、また、より高いスコアのために努力します。すなわち、総合スコアとスコアが完了し、セルが各二乗和の各図に充填されているだけこの数の積
ここに画像を挿入説明
の合計スコアとのみ対応フィルの数、各正方形に完了するスコアグリッド上の数字の積の和。以下の図に示すように、2829年の合計スコアを単独でゲームの目標数の形状を充填しました。ゲームの規制は、レベルは合計スコアの勝者を決定します。

熱意の町はあなたのために良いプログラムを見つけることがあるので、あなたは彼が得ることができる指定されたターゲット型の数独のための最高のスコアを見つけやすくしましょう。

入力形式

9行の合計。各列99個の整数(0〜9の範囲内の各数値)は、数独グリッドが充填されていない表し、塗りつぶされていないスペースが「0」で表されます それぞれ2つの数字の間のスペースで区切られています。

出力フォーマット

総出力ライン。あなたは別の形の最高得点出力対象番号を取得することができます。これだけの数がないソリューション、整数-1の後、出力する場合。

サンプル入力と出力

入力#1レプリケーション
。7 0 0 9 0 0 0 0 1
1 0 0 0 0 5 9 0 0
0 0 0 2 0 0 0 8 0
0 0 5 0 2 0 0 0 3
0 0 0 0 0 0 6 4 8
。4 1. 3 0 0 0 0 0 0
0 0 0 0 2 7 9 0 0
2 0 0 1 0 6 8 4 0
0 0 8 5 4 0 0 1 2
出力#1コピー
2829を

入力#2コピー
0 0 0 7 0 2 4 5 3
。9 0 0 0 0 8 0 0 0
。7 4 0 0 0 5 0 1 0
。1 9 5 0 8 0 0 0 0
0 7 0 0 0 0 0 2.5
0 3 0 0 1 5 9 8 7
0 0 0 6 0 1 0 0 0
0 0 0 0 6 9 1 0 0
0 0 0 0 0 0 0 0 6
出力#2コピー
2852を

説明/ヒント

[データ範囲]

データの40%、30未満の非ゼロ数の数の数だけ。

データの80%未満、26以上の非ゼロ数の数の数だけ。

データの100%未満、24以上の非ゼロ数の数の数だけ。

グループIVのタイトルを改善するためNOIP 2009

分析

まず第一に、この質問は、最初の言葉を理解していない、数独を理解する必要があり、適切な方法の基礎数独は、タイトルの下に見ることができる
数独のタイトル

この質問は、各グリッドのスコアの増加に数独をもとに、実際には、実際にはより多くの唯一の最終統計の割合よりも、基本的には同じです。

:難易度を向上させるだけでなく、中にスコアを上げるが、タイムアウトは、場合にのみ、そのようなラインフィルによってデジタルラインとしての共通の数で最初の行から開始するようにするために
いくつかのポイント前回出て、それが最適化されなければなりません。

どのように最適化するには?実際には、数独、ラインフィルによってスタートラインから必ずしも最初の行は、私たちが満たされたスタートのいくつかの行埋めた人々の数を選択することができない
最初の複数の番号を記入して、ためにそうするが、我々は唯一のラインを必要とします番号を記入し、時間のセーブDFSだろうそのためには、少なくなります。

そして、どのように行いますか?私たちは、最初の数独ディスク、オープン構造を読んで、各行はいくつかの数字がダウンしており、その後、ソート順、デジタルとより最前列に立ってください。
DFSをやって起動すると、毎回ソートの最初の行から良いスタートは、ちょうど順序を継続するために、第2行目から良いに必要事項を記入,,,,

構造についての話は、この行の元の場所にいると、ラインのどのように多くのデジタル入力で録音する必要があります。
その他の基本的な数独違いはありません。

コード

#include<iostream>
#include<cmath>
using namespace std;
#include<algorithm>

int a[10][10];
int vx[10][10],vy[10][10],vc[10][10];
int ans = -1;

struct Node{
	int num,cnt;
}so[10];
bool cmp(Node x,Node y){
	return x.cnt > y.cnt;
}
void dfs(int x,int y){
	int sx = x;
	x = so[sx].num;    //把它原始 行 拿出来 
	if(sx==9){
		int sum=0;
		for(int i=0;i<9;i++){
			for(int j=0;j<9;j++){
				sum += a[i][j] * min(10-abs(i-4),10-abs(j-4));
			}
		}
		ans = max(ans,sum);
		return ;
	}	
//	if(x==9){
//		int sum=0;
//		for(int i=0;i<9;i++){
//			for(int j=0;j<9;j++){
//				sum += a[i][j] * min(10-abs(i-4),10-abs(j-4));
//			}
//		}
//		ans = max(ans,sum);
//	}

	if(y==9){
		dfs(sx+1,0);
		return ;
		
	}
	if(a[x][y]){
		dfs(sx,y+1);
	}else{
		for(int i=1;i<=9;i++){
			if(!vx[x][i] && !vy[y][i] && !vc[x/3*3+y/3][i]){
				vx[x][i] =1;
				vy[y][i] =1; 
				vc[x/3*3+y/3][i] =1;
				a[x][y] = i;
				dfs(sx,y+1);
				
				vx[x][i] =0;
				vy[y][i] =0; 
				vc[x/3*3+y/3][i] =0;
				a[x][y] = 0;
			}
		}
	}
}

int main(){
	for(int i=0;i<9;i++){
		so[i].num = i;
		for(int j=0;j<9;j++){
			cin>>a[i][j];
			if(a[i][j]){
				vx[i][a[i][j]] = 1;
				vy[j][a[i][j]] = 1;
				vc[i/3*3+j/3][a[i][j]] = 1;
				so[i].cnt ++;
				
			}
			
		}
	}
	sort(so,so+9,cmp);
	dfs(0,0);
	cout<<ans<<endl;
	
	return 0;
}
公開された75元の記事 ウォンの賞賛1 ビュー3637

おすすめ

転載: blog.csdn.net/A793488316/article/details/104726514