我们的一道作业题
/*在电话语音识别中需要识别电话号码,这需要识别0到9十个数字,而识别前首先需要训练这十个数字,请编写程序设计一个电话号码表,
要求数字组数最少。其中:每一组数字都是八位(例如:62781704),
0到9十个数字中每两个数字之间至少连接一次
(象62781707,其中出现了:6-2、2-7、7-8、8-1、1-7、7-0、0-7七个连接,7-0和0-7是不同的连接),
0-0、1-1、......、9-9的连接也要考虑。每个数字在开头、
结尾至少各出现一次(象62781707,其中6在开头出现一次,7在结尾出现一次)。*/
想法:将所有的100种组合列成一个十行十列的数表,在搜一搜就很容易了。
#include<iostream>
using namespace std;
void main()
{
int i=0,j=0;
int (*p)[10]=new int[10][10]; //建立数表A
for(j=0;j<10;j=j+2) //偶数列放置0,1……9
for(i=0;i<10;i++)
p[i][j]=i;
for(i=0;i<10;i++) //奇数列循环放置1……9 ,0
{
p[i][1]=(i+1)%10;
p[i][3]=(i+2)%10;
p[i][5]=(i+3)%10;
p[i][7]=(i+4)%10;
p[i][9]=(i+5)%10;
}
//数表A中有10个数的所有组合,电话表在其中选取
//数表A的前八列有七十个不同组合,且每个数字在开头结尾各出现一次
int(*ppt)[8]=new int[15][8]; //为输出建立一个十五行八列的数组B
for(i=0;i<10;i++) //将A表的前八列放入B的前十行
for(j=0;j<8;j++)
ppt[i][j]=p[i][j];
//电话表的剩余三十种组合在A表的最后三列循环取,可取28种组合
int k=0;
for(i=10;i<14;i++) //将A表的后三列依次放入B表的后四行
for(j=0;j<8;j++)
{
ppt[i][j]=p[k/3][k%3+7];k++;
if(j==7)k--;
}
ppt[14][0]=9;ppt[14][1]=4;ppt[14][2]=4; //只剩下9-4,4-4未出现,所以组合起最后一行
for(i=3;i<8;i++)
ppt[14][i]=i;
cout<<"电话号码表是 "<<endl;
for(i=0;i<15;i++) //打印电话表
{
for(j=0;j<8;j++)
cout<<ppt[i][j];
cout<<endl;
}
}
运行结果:
电话号码表是
01020304
12131415
23242526
34353637
45464748
56575859
67686960
78797071
89808182
90919293
40551662
27738849
99500611
17228339
94434567
Press any key to continue
欢迎来拍