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);
?>