問題レポートにGDUT_の冬のトレーニングソリューション_トピックI_B、C、Dのタイトル問題レポートに個別のソリューション
問題B:DFS(他の人を教える際に地雷除去を書き込む前に、DFSは躊躇なく感染機能を言う言う言わないだろうので、私は、感染の機能を呼び出すことを好みます。)
最近雨による、農民ジョンはN×Mと共にプール様々な分野で水(1 <= N <= 100; 1 <= M <= 100)は四角で表されます。各正方形を含む水( "W")またはドライ( "")。ファーマージョンはどのくらい彼のフィールド池を探していました。池の水は、その8つの近傍に正方形隣接考えられる接続正方形、の基です。
マップへファーマージョンの分野では、彼の池のどのくらいを決定します。
エントリー
* 1行目:NとM:二つの空間は、整数を分離
*各行2 ... N + 1:Mの文字、彼の党ファーマージョンのフィールドの代わりに。各文字は「W」ですか。「」文字の間にスペースはありません。
輸出
* 1行目:池ファーマージョンのフィールド数。
样例输入
10 12
W。。。。。。。。WW。
。WWW。。。。。WWW
。。。。WW。。。WW。
。。。。。。。。。WW。
。。。。。。。。。W。。
。。W。。。。。。W。。
。W。W。。。。。WW。
W。W。W。。。。。W。
。W。W。。。。。。W。
。。W。。。。。。。W。
出力例:
3
これは何も言うこと、燃える橋のDFSの通常タイプを持っていないし、その後ワットユニコムを見つけることができるように、彼が感染したが、彼はまだ非反復方法に「」になりました。
コードの場合:
using namespace std;
int n, m;
void dfs(int,int);
char all[110][110];
int main()
{
scanf ( "%d %d", &n, &m );
for ( int time = 0; time < n; time++ )
{
for ( int time1 = 0; time1 < m; time1++ )
{
scanf ( " %c", &all[time][time1] );
}
}
int sum=0;
for(int time=0;time<n;time++)
{
for(int time1=0;time1<m;time1++)
{
if(all[time][time1]=='W'){dfs(time,time1);sum++;}
}
}
// for ( int time = 0; time < n; time++
// {
// for ( int time1 = 0; time1 < m; time1++ )
// {
// printf ( "%c", all[time][time1] );
// }
// printf("\n");
// }
printf("%d\n",sum);
return 0;
}
inline bool ilegal(int a,int b){
return a<0||b<0||a>=n||b>=m;
}
void dfs(int a,int b)
{
all[a][b]='.';
for(int time=-1;time<2;time++)
{
for(int time1=-1;time1<2;time1++)
{
//if((time!=0)&&(time1!=0))
{
if(!ilegal(a+time,b+time1)&&(all[a+time][b+time1]=='W'))
dfs(a+time,b+time1);
}
}
}
return ;
}
小さな用法の蓄積:事の合法性を判断ilegal機能は、非常に一般的な、工程を簡略化するために
問題C:DFS
上記のタイルで覆われた長方形の部屋には、があります。各タイルは赤か黒です。黒いタイルの上に立っている人。タイルから、彼は4枚の隣接するタイルの1つに移動することができます。しかし、彼は唯一の黒いタイルの上に移動することができ、赤瓦の上に移動することはできません。
彼は上記の動作を繰り返すことで到達することができ、黒のタイルの数を計算するプログラムを書きます。
エントリー
データ入力の複数の組成を設定します。データは、ラインW及びHから始まる2つの正の整数を含むように設定; W及びHは、x方向とy方向のタイルの数です。WとHは20を超えてはなりません。
そこそれぞれがWの文字を含むデータセットHラインを。下記に示すように、各タイルは、文字の色を表しています。
」.'-黒タイル
『35、』 -タイル赤
-黒タイル上に立っている人(のみプライマリデータで濃縮) 『!』
入力ライン端部は、2つのゼロの表現です。
輸出
各データセットの場合は、あなたのプログラムは、出力タイルを含む行は、彼がから到着(自身を含む)の初期タイルを数えることができるはずです。
サンプル入力
6 9
。。。。#。
。。。。。#
。。。。。。
。。。。。。
。。。。。。
。。。。。。
。。。。。。
#@#...
#...#。
11 9
。#...
。#。#######。
。#。#...#。
。#。#。###。#。
。#。#...@#.#。
。#。#####。#。
。#...#。
。#########。
...
11 6
...#...#...#...
...#...#...#...
...#...#... ###
...#...#...#@。
...#...#...#...
...#...#...#...
7 7
...#。#...
...#。#...
###。###
... @ ...
###。###
...#。#...
...# 。#...
0 0
出力例:
45
59
6
13
この質問と似た質問Bは、コードに直接行くことはありません。
using namespace std;
int line,arr;
char all[21][21];
void dfs(int x,int y);
int sum=0;
int check(int a,int b);
int main()
{
while(~scanf("%d %d",&line,&arr))
{
if(line==0||arr==0)return 0;
int start_x,start_y;
sum=0;
getchar();
for(int time=0;time<arr;time++)
{
for(int time1=0;time1<line;time1++)
{
all[time][time1]=getchar();
if(all[time][time1]=='@'){start_x=time;start_y=time1;}
}
getchar();
}
//input finished
dfs(start_x,start_y);
printf("%d\n",sum);
}
return 0;
}
void dfs(int x,int y)
{
all[x][y]='#';
sum++;
if(check(x-1,y)&&all[x-1][y]=='.')dfs(x-1,y);
if(check(x+1,y)&&all[x+1][y]=='.')dfs(x+1,y);
if(check(x,y-1)&&all[x][y-1]=='.')dfs(x,y-1);
if(check(x,y+1)&&all[x][y+1]=='.')dfs(x,y+1);
}
int check(int a,int b)
{
if(a<arr&&a>-1&&b<line&&b>-1)return 1;
else return 0;
}
Dタイトル:DFS(テンプレートのタイトル)
BCのタイトルよりも多くのトリック、
私は衛星が私の母にネックレスを作るKを使用しようとするN個の宝石を、持っているが、彼女はあまりにも重いネックレスを受け入れないでしょう。アカウントに各宝石の値と重量を取って、私の母は受け入れられていた最も貴重なネックレスを見つけるために私を助けてください。
エントリー
入力の最初の行はケースの数です。
それぞれの場合において、最初の行は、2つの整数を含むN(N <= 20)、すなわち、石の数、K(K <= N) 、すなわち、石で作られた正確な数のネックレス。
N行続いて、各行は2つの整数を含む:(<= 1000)、各宝石の値を示す; B(B <= 1000)、宝石の重量を表します。
各行の最後の行は、私の母は= 1000ワット、最大重量を受け、整数wが含まれています。
輸出
各場合において、ネックレスの出力の最大値。
サンプル入力
1
2 1
1 1
1 1
。3
サンプル出力
1
BCタイトルパターンよりも、この主題は、N個のアイテムから始まる、最大は彼女の母親の首の重さを受け入れたが、また、最も高価超えない計量C項目を作るCをとり、ナップザック問題を見てみると、検索でのデータの爆発です
コードは以下の通りであります:
using namespace std;
int N;
int K;
int V[21];
int W[21];
void dfs(int value,int weight,int i,int num);
int accepted_weight;
int _Max;
int main()
{
int t;
scanf("%d",&t);
for(int time=0;time<t;time++)
{
_Max=INT_MIN;
scanf("%d %d",&N,&K);
for(int time1=0;time1<N;time1++)
{
scanf("%d %d",&V[time1],&W[time1]);
}
scanf("%d",&accepted_weight);
dfs(0,0,0,0);
printf("%d\n",_Max);
}
return 0;
}
void dfs(int value,int weight,int i,int num)
{
if(i==N){if(_Max<value)_Max=value;}
else
{
if(weight+W[i]<accepted_weight&&num<K)dfs(value+V[i],weight+W[i],i+1,num+1);
dfs(value,weight,i+1,num);
}
return ;
}
DFSは意義のパラメータを処理し、それがAさんには比較的容易です