您的位置:首页 > 编程语言 > C语言/C++

2014年第五届蓝桥杯C/C++程序设计本科B组决赛 信号匹配(代码填空)

2016-05-13 12:29 453 查看
2014年第五届蓝桥杯C/C++程序设计本科B组决赛题目汇总:

/article/7584907.html

信号匹配

从X星球接收了一个数字信号序列。

现有一个已知的样板序列。需要在信号序列中查找它首次出现的位置。这类似于串的匹配操作。

如果信号序列较长,样板序列中重复数字较多,就应当注意比较的策略了。可以仿照串的KMP算法,进行无回溯的匹配。这种匹配方法的关键是构造next数组。

next[i] 表示第i项比较失配时,样板序列向右滑动,需要重新比较的项的序号。如果为-1,表示母序列可以进入失配位置的下一个位置进行新的比较。

下面的代码实现了这个功能,请仔细阅读源码,推断划线位置缺失的代码。

// 生成next数组
int* make_next(int pa[], int pn)
{
int* next = (int*)malloc(sizeof(int)*pn);
next[0] = -1;
int j = 0;
int k = -1;
while(j < pn-1){
if(k==-1 || pa[j]==pa[k]){
j++;
k++;
next[j] = k;
}
else
k = next[k];
}

return next;
}

// da中搜索pa, da的长度为an, pa的长度为pn
int find(int da[], int an, int pa[], int pn)
{
int rst = -1;
int* next = make_next(pa, pn);
int i=0;  // da中的指针
int j=0;  // pa中的指针
int n = 0;
while(i<an){
n++;
if(da[i]==pa[j] || j==-1){
i++;
j++;
}
else
__________________________;  //填空位置

if(j==pn) {
rst = i-pn;
break;
}
}

free(next);

return rst;
}

int main()
{
int da[] = {1,2,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,1,2,1,2,3};
int pa[] = {1,2,1,1,2,1,1,1,2};

int n = find(da, sizeof(da)/sizeof(int), pa, sizeof(pa)/sizeof(int));
printf("%d\n", n);

return 0;
}


思路:kmp

答案:j=next[j]

// 生成next数组
int* make_next(int pa[], int pn)
{
int* next = (int*)malloc(sizeof(int)*pn);
next[0] = -1;
int j = 0;
int k = -1;
while(j < pn-1){
if(k==-1 || pa[j]==pa[k]){
j++;
k++;
next[j] = k;
}
else
k = next[k];
}

return next;
}

// da中搜索pa, da的长度为an, pa的长度为pn
int find(int da[], int an, int pa[], int pn)
{
int rst = -1;
int* next = make_next(pa, pn);
int i=0;  // da中的指针
int j=0;  // pa中的指针
int n = 0;
while(i<an){
n++;
if(da[i]==pa[j] || j==-1){
i++;
j++;
}
else
<span style="font-family: 'Microsoft YaHei';font-size:18px;">j=next[j]</span>;  //填空位置

if(j==pn) {
rst = i-pn;
break;
}
}

free(next);

return rst;
}

int main()
{
int da[] = {1,2,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,2,1,2,1,1,2,1,1,2,1,1,1,2,1,2,3};
int pa[] = {1,2,1,1,2,1,1,1,2};

int n = find(da, sizeof(da)/sizeof(int), pa, sizeof(pa)/sizeof(int));
printf("%d\n", n);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: