ブルーブリッジカップアルゴリズムのトレーニング手順と血液(DFS、C ++)

テストアルゴリズムのトレーニング手順と血液

リソース制限
時間制限:1.0秒メモリ制限:256.0MB
問題の説明
  n * n個の正方形があり、m個の障害物があり、i番目の障害物はp [i]ポイントの血液を消費します。最初はCポイントの血液があり、(1,1)から(n、n)に移動し、血液量が0より大きいことを確認して、最小ステップ数を見つける必要があります。
入力フォーマット
  最初の行の3つの整数n、m、cは、ボードのサイズ、障害物の数、および血液量を示します。
  次のm行、各行は障害物を表します。3つの整数xypが含まれ、障害物がx番目の行とy番目の列にあり、血液消費量がpであることを示します。
出力形式
  歩数に達することができる場合は、「いいえ」を出力します。
サンプル入力1010
10
2 8 35
1 10 25
9 9 63
5 6 46
2 6 43
8 7 92
5 3 54
3 3 22
7 9 96
9
1013サンプル出力
18
データスケールと合意された
  入力データ範囲内の各数値。
  0 <n、m <100、

はじめに:DFSはまだ少し錆びており、デバッグに長い時間がかかり、再帰的なQAQに習熟していません。

アイデアと分析:

1.これは典型的なDFSです。この質問では、最後に到達するために必要なステップ数を把握するだけでよいため、プロセスが最適なソリューションであるかどうかについてあまり考える必要はありません(どこに到達するかを尋ねられます)残りの最高のHPはどうですか?)なので、この質問は比較的簡単です。パスが何であっても、合計(n-1)* 2ステップである必要があります。 1から1からnまで、nはあなただけが生き残ることができるかどうかを判断する必要があるだけでフィニッシュ。。:

	if(活着到终点)
		printf("%d", n * 2 - 2);
	else
		printf("No");

2.次に、最初にマップを格納するn * n配列を作成し、次にそれをdfsします。

int n, m, heart;					//初始化一下
	cin >> n >> m >> heart;
	memset(a, 0, sizeof a);
	int i, j, k;
	while (m--)
	{
    
    
		cin >> i >> j >> k;
		a[i][j] = k;
	}
// x,y是坐标,n是边界,blood是剩余血量
void dfs(int x, int y, int n, int blood)
{
    
    

	if (x == n && y == n)
		{
    
    
		    flag = 1;		//flag等于1代表活着到终点
		}
    if(flag == 1) return;	//活着就一直return回main
	if ( x < n && y <= n && blood - a[x + 1][y] > 0)
	{
    
    	
		//如果可以向右走就 ,x + 1, y
		dfs(x + 1, y, n, blood - a[x + 1][y]);
	}

	if ( x <= n && y < n && blood - a[x][y + 1] > 0)
	{
    
    
		//如果可以向下走就 ,x, y + 1
		dfs(x, y + 1, n, blood - a[x][y+1]);
	}
}

3.最初のHPは次のよ​​うになります。

	int blood = heart - a[1][1];	//起始血量要减去a[1][1]

ACコードは次のとおりです。

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[102][102];		//地图
int flag=0;				//ans
void dfs(int x, int y, int n, int blood)
{
    
    

	if (x == n && y == n)
		{
    
    
		    flag = 1;
		}
    if(flag == 1) return;
	if ( x < n && y <= n && blood - a[x + 1][y] > 0)
	{
    
    
		dfs(x + 1, y, n, blood - a[x + 1][y]);
	}

	if ( x <= n && y < n && blood - a[x][y + 1] > 0)
	{
    
    
		dfs(x, y + 1, n, blood - a[x][y+1]);
	}
}


int main() {
    
    
	int n, m, heart;
	cin >> n >> m >> heart;
	int blood;
	memset(a, 0, sizeof a);
	int i, j, k;
	while (m--)
	{
    
    
		cin >> i >> j >> k;
		a[i][j] = k;
	}
	blood = heart - a[1][1];
	dfs(1,1,n,blood);
	if(flag)
		printf("%d", n * 2 - 2);
	else
		printf("No");
	return 0;
}

あとがき:急いでもっと多くのDFを練習するか、Blue Bridge(Retrospective)CupQAQに参加する方法

おすすめ

転載: blog.csdn.net/Kyrie_irving_kun/article/details/113856279