LETTERS(回溯深搜)

描述

给出一个roe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。

格式

输入格式

第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。 接着输出R行S列字母矩阵。

输出格式

最多能走过的不同字母的个数。

样例

输入样例

3 6
HFDFFB
AJHGDH
DGAGEH

输出样例

6

限制

时间限制: 1000 ms

内存限制: 65536 KB

现在做的几个回溯题目感觉有点模板形式,套路很简单,找到递归的三要素,递归结束后进行回溯处理。

递归的三要素:递归出口、函数处理过程、递归参数。说明一下这里的递归出口是a[c[tmpx][tmpy]] == 1的情况。

对回溯有疑惑的,可以看看该博主的博文:LeetCode--回溯法心得 

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
int a[92];
int r, s, ans=0;
char c[22][22];

void dfs(int, int, int);

int main()
{
	memset(a, 0, sizeof(a));
	int sum=1;
	scanf ("%d %d\n", &r, &s);
	for (int i=0; i<r; i++) {
		for (int j=0; j<s; j++) {
			scanf ("%c", &c[i][j]);
		}
		getchar();
	}
	
	int x = 0;
	int y = 0;
	a[c[x][y]] = 1;
	dfs(x, y, sum);
	printf ("%d\n", ans);
	return 0;
}

void dfs(int x, int y, int sum) {
	
	if (sum > ans) {
		ans = sum;
	}
	for (int i=0; i<4; i++) {	//递归函数的处理过程
		int tmpx = x + dx[i];
		int tmpy = y + dy[i];
		if (a[c[tmpx][tmpy]] == 0 && tmpx >= 0 && tmpx < r && tmpy >= 0 && tmpy < s) {    //递归出口判断
			x += dx[i];
			y += dy[i];
			a[c[x][y]] = 1;       //开始经过一个字母
			dfs(x, y, ++sum);    //别用sum++;
			a[c[x][y]] = 0;       //以下为回溯
			x -= dx[i];
			y -= dy[i];	
                        sum--;
		}
	}
	
}
发布了89 篇原创文章 · 获赞 77 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/wodemaoheise/article/details/105021506
今日推荐