poj2245 Lotto

1705 ワード

poj2245 Lotto
http://poj.org/problem?id=2245
問題を解く構想:本題は深さ優先で基礎問題を検索し、多くの条件がなく、前から後まで、6つの数を足せばよい.
最後のデータのセットを処理することなく、nがスペースで区切られた数字の最後のセットのテストケースのnが0であるnを与えます.要求前から後までのいずれかのグループ6個の数を探し出し,要求を満たすすべての数(グループ)を出力する.各グループ数は1行を占め、2つのテストケースの出力は中間に1つの空白行を隔てており、最後のテストケースのデータ出力後に空白行を出力しないでください.
単純深さ優先探索は,検索された限り,現在保存されている配列の数字が6個あれば出力される.
(1)n現在のテストデータを記録するためのデータ数を定義する.現在のテストデータの操作データ(nを除く)を格納する配列num[]を定義します.選択(検索)した数を格納する配列out[]を定義します.
(2)目標出力数を検索するための関数dfs(int i,int many)を定義し、iは前回検索した数が操作データ配列に格納された位置の次の位置、すなわち今回検索を開始する位置を表し、検索したデータが前から後に現れることを保証する.manyは現在の出力配列の中で検索されたデータの個数を表し、今回検索されたデータが出力配列に格納された位置の下付き文字でもあり、manyが6に等しい場合、問題に合致する数のセットが検索されたことを示し、すぐに出力され、検索を継続する.検索が終了すると、要求を満たすすべての数の組合せがすべて出力されます.そうでなければ、後で検索されていないすべてのデータを検索します.
12053720
20114045007
2245
Accepted
116K
0MS
C++
698B
2013-08-29 22:43:18
#include<stdio.h> #include<string.h> int n,num[14],vist[14]; int out[8]; void dfs(int i,int many) {     if(many==6)  //      {         printf("%d",out[0]);   //          for(int j=1;j<6;j++)         printf(" %d",out[j]);         printf("
"); return ; } for(;i<n;i++) // { if(!vist[i]) // ( ) ( ), , , { out[many]=num[i]; vist[i]=1; dfs(i+1,many+1); vist[i]=0; } } } int main() { int j=0; while(scanf("%d",&n)&&n) { if(j)printf("
"); // for(int i=0;i<n;i++)scanf("%d",&num[i]); memset(vist,0,sizeof(vist)); dfs(0,0); j=1; } return 0; }