请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。
注意:
输入的路径不为空;
所有出现的字符均为大写英文字母;
样例
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;
}