连了1个多小时都没登陆成功,就去群里聊天。听朋友说了个题目,我觉得有思路就写了一下。
后来终于登陆成功了,可惜我分配到19组题目不一样- -。
问题是这样的,一个m*n的字母矩阵内可以找到多少8连通路径匹配一个长度为k的串。m,n,k都不超过50
如果匹配数量超过10^9就直接返回-1.
#pragma warning(disable:4786)
#include <vector>
#include <string>
#include <cstdio>
using namespace std;
class A


{
public:
int get(vector< string > _map, string a)

{
const int max = 1000000000;

char map[52][52] =
{0};
int m = _map.size(), n;
int i, j;
string::size_type k;
for (i = 0; i < m; i++)

{
strcpy(map[i+1] + 1, _map[i].c_str());
}
n = _map[0].size();

int count[2][52][52] =
{0};

{
int (&pd)[52][52] = count[0];
char c = a[0];
for (i = 1; i <= m; i++)

{
for (j = 1; j <= n; j++)

{
if (map[i][j] == c)
pd[i][j] = 1;
}
}
}
for (k = 1; k < a.size(); k++)

{
int (&pd)[52][52] = count[k%2];
int (&ps)[52][52] = count[(k+1)%2];
memset(pd, 0, sizeof(int) * 52 * 52);
char c = a[k];
for (i = 1; i <= m; i++)

{
for (j = 1; j <= n; j++)

{
if (map[i][j] != c) // 这里把map写成了_map,谢谢
continue;
pd[i][j] = ps[i-1][j-1]+ps[i][j-1];
if (pd[i][j] > max) return -1;
pd[i][j] += ps[i+1][j-1];
if (pd[i][j] > max) return -1;
pd[i][j] += ps[i-1][j];
if (pd[i][j] > max) return -1;
pd[i][j] += ps[i+1][j];
if (pd[i][j] > max) return -1;
pd[i][j] += ps[i-1][j+1];
if (pd[i][j] > max) return -1;
pd[i][j] += ps[i][j+1];
if (pd[i][j] > max) return -1;
pd[i][j] += ps[i+1][j+1];
if (pd[i][j] > max) return -1;
}
}
}
int sum = 0;
int (&ps)[52][52]=count[(k+1)%2];
for (i = 1; i <= m; i++)

{
for (j = 1; j <= n; j++)

{
sum += ps[i][j];
if (sum > max)
return -1;
}
}
return sum;
}
};

/**//*
{"AAAAA",
"AAAAA",
"AAAAA",
"AAAAA",
"AAAAA"}
"AAAAAAAAAAA"
Returns: -1
超过1,000,000,000的路径,则直接返回-1.
kaikai (30170377) 22:38:25
复杂度m*n*k
沐枫(Liny)(189416) 22:28:47
{"AB",
"CD"}
"AA"
结果:0
沐枫(Liny)(189416) 22:30:42
{"AA",
"AA"}
"AAAA"
结果: 108
*/
#include <cstdio>

int main()


{
A a;
vector< string > d1;
d1.push_back("AAAAA");
d1.push_back("AAAAA");
d1.push_back("AAAAA");
d1.push_back("AAAAA");
d1.push_back("AAAAA");
printf("%d\n", a.get(d1, "AAAAAAAAAAA"));
vector< string > d2;
d2.push_back("AB");
d2.push_back("CD");
printf("%d\n", a.get(d2, "AA"));
vector< string > d3;
d3.push_back("AA");
d3.push_back("AA");
printf("%d\n", a.get(d3, "AAAA"));
return 0;
}