1.成语纠错(15分)
问题背景
成语是中华民族的文化瑰宝,作为历史的缩影、智慧的结晶、汉语言的精华,闪烁着睿智的光芒。
你的任务是给一个错误的四字成语进行纠错,找到它的正确写法。具体来说,你只允许修改四个汉字中的其中一个,使得修改后的成语在给定的成语列表中出现。原先的错误成语保证不在成语列表中出现。
有时,这样的“纠错”结果并不惟一。例如“一糯千金”可以改为“一字千金”也可以改成“一诺千金”。但由于“糯”和“诺”是同音字,“一糯千金”实为“一诺千金”的可能性比较大。
因此,我们还将提供一个汉字分类表,要求修改前后的两个字必须属于同一个分类。
在这样的限制下,我们保证成语纠错的结果惟一。
注意
1、汉字均采用GBK编码(参见FAQ)
2、每个汉字分类至少包含两个汉字,同一个汉字可能出现在多个类别中。
3、成语列表中的成语都是真实存在的四字成语。成语列表和待纠错成语中的所有汉字均在汉字分类表中的至少一个分类中出现。
输入格式
输入第一行包含两个整数n,m(1<=n<=200,1<=m<=20000)。n表示汉字类别的个数,m表示成语的个数。
以下n行每行用一个无空白分隔符(空格、TAB)的汉字串表示一个分类中的所有汉字。注意,该汉字串最多可能包含200个汉字。
以下m行为成语列表,每行一个成语,恰好四个汉字。
最后一行为待纠错的成语,恰好四个汉字,且不在成语列表中出现。
输出格式
仅一行,为一个四字成语。在“修改必须在同一分类中进行”的限制下,输入数据保证纠错结果惟一。
样例输入
73
糯诺挪喏懦
字自子紫籽
前钱千牵浅
进近今仅紧金斤尽劲
完万
水睡税
山闪衫善扇杉
一诺千金
一字千金
万水千山
一糯千金
样例输出
一诺千金
基本方法:把错误成语与成语数组每个成语比较,当遇到有一个字不同时,进行分类的判断,若在同一分类里,输出这种修改
PHP代码:
<?php
//解析字符串中英文支付,成为字符数组,得长度
//$fustr='dddddddddddddgdg大股东广东';//带解析的字符串
function str_arr($fustr,$mudi=1)
{$wz=0;
$arr=array();
while($wz<strlen($fustr)){
$zifu=$fustr[$wz];
if(ord($zifu)>127){$str=$zifu.$fustr[$wz+1];$wz=$wz+2;}
else{$str=$zifu;$wz++;}
$arr[]=$str;//放到数组里
}//end while($wz<strlen($fustr))
if($mudi==1)return $arr;
else return count($arr);
}
//测试
//$arr=str_arr($fustr,$mudi=1);
//print_r($arr);
//end 解析字符串
//截取函数,截取字符串数组,得到部分字符串
//$arr=array();//字符串数组
$ks=0;//截取开始位置
$long=10;//截取长度,多少个字符
function jiequ($arr,$ks,$long=0){
if($ks+$long>count($arr))return false;
$str='';
$maxlen=count($arr);
if($long==0)$end=$maxlen;
else $end=$ks+$long;
for($i=$ks;$i<$end;$i++){
$str.=$arr[$i];
}
return $str;
}
//成语纠错
$cengyu=array('一诺千金','一字千金','万水千山');//成语数组
$cuoci='一子千金';//错误的成语,需要把错误的字改正确
$fenlei=array('糯诺挪喏懦','字自子紫籽','前钱千牵浅','进近今仅紧金斤尽劲','完万','水睡税','山闪衫善扇杉');//分类数组
$arr1=str_arr($cuoci);//解析为字的数组
//遍历成语数组,找到正确的成语,进行修改
for($i=0;$i<count($cengyu);$i++){
$arr2=str_arr($cengyu[$i]);
$butong=0;//不同的数量
$jishu=0;
//统计有几个不同,路过一个,那么可以修改
for($i1=0;$i1<4;$i1++){
if($butong>=2)break;
if($arr1[$i1]==$arr2[$i1])$jishu++;
else {$butong++;$index=$i1;}
}//end for($i1=0;$i1<4;$i1++)
//判断不同的数量,路过为1,那么需要判断是否同类
if($butong==1){
$zi1=$arr1[$index];
$zi2=$arr2[$index];
//判断是否同类
$tonglei=0;
for($i2=0;$i2<count($fenlei);$i2++){
if(strpos($fenlei[$i2],$zi1)!==false&&strpos($fenlei[$i2],$zi2)!==false){
$tonglei=1;
break;
}
}//end for($i2=0;$i2<count($fenlei)
if($tonglei==1){echo $cuoci.'中'.$zi1.'改为:'.$zi2.',正确的成语为:'.$cengyu[$i].'<br>';
break;
}//end if($tonglei==1){
}//end if($butong==1)
}//end for($i=0;$i<count($cengyu);
?>