矩阵的检索路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。

路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。

如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。

注意:

输入的路径不为空;
所有出现的字符均为大写英文字母;
样例
matrix=
[
[“A”,“B”,“C”,“E”],
[“S”,“F”,“C”,“S”],
[“A”,“D”,“E”,“E”]
]

str=“BCCE” , return “true”

str=“ASAE” , return “false”
可以用深度优先遍历。看这篇文章之前先把数据结构的图的深度优先算法给弄清楚,可能做起来就没有那么复杂

#include<stdio.h>
#include<stdlib.h>
//#include<string.h>
#define true 1
#define false 0
int exist(char* arr, int len1, int len2, char* word) {
	if ((arr == NULL) || (word == NULL) || (len1 <= 0) || (len2 <= 0))//判断是否出现失误
		return false;
	int* a= (int*)malloc((len1 * len2) * sizeof(int));
	//memset(a, 0, (len1 * len2) * sizeof(int));和下面那个等价不过得用上面的#include<string.h>
	for (int i = 0; i < len1 * len2; i++)
		a[i] = 0;
	int p = 0;//检索字符串的第一个元素位置
	for (int row = 0; row < len1; row++) {
		for (int col = 0; col < len2; col++)
		{
			if (dfs(arr, len1, len2, word, row, col, p, a))
				return true;
		}
	}
	free(a);
	return false;
}
int dfs(char* arr, int len1, int len2, char* word,int row, int col, int p,int*a)
{
	if (a == NULL)
		return false;
	if (word[p] == '\0')//判断是否结束
		return true;
	int path = false;
	if ((row >= 0) && (row < len1) && (col >= 0) && (col < len2) && (arr[row * len2 + col] == word[p]) && (!a[row * len2 + col])) {
		p++;
		a[row * len2 + col] = true;
		path = dfs(arr, len1, len2, word, row, col - 1, p, a)/*左移*/ ||
			dfs(arr, len1, len2, word, row, col + 1, p, a) /*右移*/||
			dfs(arr, len1, len2, word, row - 1, col, p, a)/*上移*/ ||
			dfs(arr, len1, len2, word, row + 1, col, p, a)/*下移*/;
			if (!path) {
			p--;
			a[row * len2 + col] = false;
		}//不能再次回到原来的地方
	}
	return path;
}
int main()
{
	int len1=3, len2=4,s;
	char arr[3][4] = {'A','B','C','E' ,'S' ,'F' ,'C' ,'S' ,'A' ,'D' ,'E' ,'E' };
	char str[10];
	printf("请输入你要输入的字符串的个数");
	scanf_s("%d", &s);
	printf("请输入你要输入的字符串");
	scanf_s("%s", str,s+1);//这里一定要多一个不然上面的if (word[p] == '\0')//判断是否结束就无法实现
	int t = exist(arr, len1, len2, str);
	if (t == 1)
		printf("true");
	else
		printf("false");
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值