欧拉方阵 (S20课后作业)
本帖最后由 qq1242009750 于 2018-7-18 00:40 编辑算法思想在文章的尾部
#ifndef xxx
#define xxx
#include "stdafx.h"
#include <iostream>
using namespace std;
struct Node
{
int data;
Node *Next;
};
template <typename T1>
class CLatin
{
public:
void CreateLoopList(T1* &rear, const int num); //创建一个N*N的循环链表
void Latin(T1* &rear, const int num);
void Print(T1* &rear, const int num);
};
template <typename T1>
void CLatin<T1>::CreateLoopList(T1* &rear, int num)
{
T1 *S = new T1;
rear = S;
rear->Next = rear;
T1 *H = rear->Next;
for (int i = 1; i < num * num; i++)
{
rear->Next = new T1;
rear = rear->Next;
rear->Next = H;
}
}
template <typename T1>
void CLatin<T1>::Latin(T1* &rear, const int num) //拉丁方阵
{
T1 *tmp = rear->Next;
for (int i = 1; i <= num; i++) //要赋值的行数
{
for (int j = i; j <= num; j++) //列的赋值,从行数开始
{
tmp->data = j;
tmp = tmp->Next;
}
if (i != 1) //如果行数不为1,则说明 1 到 i-1 的数没有写入方阵
{
for (int m = 1; m < i; m++)
{
tmp->data = m;
tmp = tmp->Next;
}
}
}
}
template <typename T1>
void CLatin<T1>::Print(T1* &rear, const int num)
{
T1 *tmp = rear->Next;
T1 *H = tmp;
int i = 0;
while (tmp->Next != H)
{
cout << tmp->data << " ";
tmp = tmp->Next;
i++;
if (i == num)
{
cout << endl;
i = 0;
}
}
cout << tmp->data << endl;
}
#endif xxx
算法思想:
1.输入一个大于等于2 小于等于9的数。
2.生成一个 N*N个节点的循环链表。
3.把循环链表抽象成一个N行N列的二维数组。
4.用1到N的数值对节点进行赋值。
5.每行的第一个节点用所在的行数赋值。 例如 ,第一行的第一个节点的值为1,第二行的第一个节点为2。
6.当行数不为1时,是不会1 到 N完整的赋值,所以当结束了列的赋值后要检测行数,把1 到 行数-1 的数值放入当前行的列中。
新手上路,自己写的,写得不好之处请大家指出{:5_91:}
页:
[1]