编程之美代码3.2电话号码对应英语单词

 
 
#include "stdafx.h"
#include<iostream>
#include<cstring>

using namespace std;

//键盘数字上的字符
char c[10][10] = {
    "", "", "ABC", "DEF",
    "GHI", "JKL", "MNO",
    "PQRS", "TUV", "WXYZ"};
//0到每个数组键上字符的个数
int total[] = {0, 0, 3, 3, 3, 3, 3, 4, 3, 4};
const int TelLength = 3; //电话号码的位数,要加const,因为数组定义要固定的长度
int number[TelLength];//每位电话号码的数字
int answer[TelLength]; //每位数字上字符的下标

//方法一
void OutputTelephone(int number[])
{
    while (true)
    {
        int k = TelLength - 1;
        //一次循环一次从第k个键向前移动一位
for (int i = 0; i < TelLength; i++)
			
				cout << c[number[i]][answer[i]] << " ";

			cout << endl;

        while (k >= 0)
        {
            
            if (answer[k] < total[number[k]] - 1)
            {
                //第k个键移动
                answer[k]++;
                break; //这里只要有一个键的一个位置发生一次变化,就退出,打印一次。
            }
            else
            {
                //第k个键移动完毕,回到,开始遍历上一个键。
                //此时,继续内部循环。下次循环,处理上一个键。
                answer[k] = 0;
                k--;
            }

        }
        if (k < 0)
            break;

    }
}

//方法
void RecursiveOutput(int number[], int answer[], int index)
{
    if (index == TelLength)
    {
        for (int i = 0; i < TelLength; i++)
            cout << c[number[i]][answer[i]] << " ";
        cout << endl;
        return;
    }
    //上下来回反弹的都以递归啊,类似于dfs
    for (answer[index] = 0; answer[index] < total[number[index]]; answer[index]++)
    {
        RecursiveOutput(number, answer, index + 1);
    }

}

int main()
{cout <<number[1] << " ";				

    int number[] = {3, 4, 5};
cout <<answer[1] << " ";				
    OutputTelephone(number);
    RecursiveOutput(number, answer, 0);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值