算法分析与设计实验-Gray码问题

Gray码问题

问题描述

Gray码是一个长度为2n的序列。序列中无相同的元素,每个元素都是长度为n位的串,相邻元素恰好只有一位不同。用分治策略设计一个算法对任意的n构造相应的Gray码。由文件input.txt提供输入数据n。程序运行结束时,将得到的所有编码输出到文件output.txt中。

实验设计

int arr[1024][1024]; //arr[i][j]表示第i个格雷码的第j位
ifstream f(“D://算法分析与设计/input2.txt”); //从文件中读取gray码位数
递归算法求Gray码:
void gray(int a, int b)//a为宽度,b为个数
{
if (宽度为1)
{
返回Gray为0和1
}
for (0-a/2)
{
//生成的Gray码前一半最高位填“0”
//后一半最高位位填“1”
}
gray(a / 2, b - 1); //生成b-1位Gray码,填写到目标码上半部分
for (int i = a / 2; i for (int j = 0; j < b - 1; j++)
反向复制到下半部分
}
ofstream of(“D://算法分析与设计/output2.txt”);//将Gray码写入文件。
程序结束

实验代码

#include "iostream"
#include "cmath"
#include
#include
using namespace std;

int arr[1024][1024]; //arr[i][j]表示第i个Gray码的第j位

//构造b位Gray码
//a为Gray码的个数
void gray(int a, int b)
{
    if (b == 1) //如果Gray码宽度为1
    {
        arr[0][0] = 0;
        arr[1][0] = 1;
        return;
    }
    for (int i = 0; i < a / 2; i++) //Gray码最高位
    {
        arr[i][b - 1] = 0;  //生成的Gray码前一半最高位填“0”
        arr[a - i - 1][b - 1] = 1;  //后一半最高位位填“1”
    }
    gray(a / 2, b - 1);  //生成b-1位Gray码,填写到目标码高半部分
   
    for (int i = a / 2; i <a; i++) //Gray码低半部分
        for (int j = 0; j < b - 1; j++)
            arr[i][j] = arr[a - i - 1][j];
}

int main()
{
    int b;
    string row;
    ifstream f("D://算法分析与设计/input2.txt"); //从文件中读取gray码位数
    getline(f,row);
    b = stoi(row);
    f.close();

    int a = pow(2, b);  //Gray码个数
    gray(a, b);
    ofstream of("D://算法分析与设计/output2.txt");//将Gray码写入文件。
    cout << "Gray码为:\n";
    for (int i = 0; i < a; i++)
    {
        for (int j = 0; j < b; j++)
        {
            cout << arr[i][j];
            of << arr[i][j] << ",";
        }
        of << endl;
        cout << endl;
    }
    of.close();
    return 0;
}

你可能感兴趣的:(分治法)