dfs入门习题

发布时间 2023-04-10 21:22:54作者: 烟雨无晴

  主要记录一下个人遇见过的一些dfs的一些入门题目。

  有需要的可以跟着题单往下做。

  题单根据自己的刷题不定时更新。

 

  第一题:

  https://codeforces.com/problemset/problem/510/B

  一道比较经典的dfs模板题。需要注意一下记忆化搜索。

 

**点击查看代码 // C++**
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int N = 100;

bool flag;
char g[N][N];
int p[N][N];
int n, m, cnt;
int qi, qj;
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};

void dfs(int x, int y, int cnt)
{	
	if (flag) return ;
	
	if (cnt >= 4 && x == qi && y == qj) {
		printf("Yes\n");
		flag = true;
		return ;
	}
	
	//记忆化搜索 , 1 代表找过 
	
	for (int i = 0; i < 4; i ++ ) {
		int tx = x + dx[i];
		int ty = y + dy[i];
		
		if (g[tx][ty] == g[x][y] && p[tx][ty] != 1 && tx >= 0 && ty >= 0 && tx < n && ty < m) {
			p[tx][ty] = 1;
			dfs(tx, ty, cnt + 1);
			p[tx][ty] = -1;
		}
	} 
	
	return ;
}


int main()
{
	cin >> n >> m;
	
	
	for (int i = 0; i < n; i ++ ) {
		for (int j = 0; j < m; j ++ ) {
			cin >> g[i][j];
		}
	}
	
	
	for (int i = 0; i < n; i ++ ) {
		for (int j = 0; j < m; j ++ ) {
			memset(p, -1, sizeof(p));
			qi = i, qj = j;
			dfs(i, j, 0);
			
		}
	}
	
	if (!flag) printf("No\n");
	
	return 0;
}