侯捷先生网站上的一个编程题目,小弟给出一个解答,请高人指教
2001 期末作业题目:
求 n * n 方阵中,(1)横、(2)纵、(3)正对角、(4)反对角 皆无相同元素之排列。
例 5 * 5 方阵,以下为一组解:
0 1 2 3 4
2 3 4 0 1
4 0 1 2 3
1 2 3 4 0
3 4 0 1 2
提示:程式应具弹性,可接受 user 输入方阵边长 n。
提示:程式面对 n= 4, 5, 6 之方阵,求解速度应「至少令人可接受」。
提示:n= 7 方阵,其解答个数已达天文数字。
提示:试评估解答个数与 n 之间有无任何规律关系。
提示:尽量运用 STL,你的 programming 工作会减轻非常非常多。
o. 资料结构可用 vectors
o. 演算法可用 next_permutation(), for_each,
o. 辅助工具可用 function objects, iterator adaptors.
o. 萤幕输入/输出可用 iostream
o. 档案输出可用 ofstream
o. 资料格式化可用 ostringstream
o. 时间计算可用 struct tm, time_t, time(), localtime()
提交:(1) 作业报告 (2) 程式源码。
评比:比执行速度,比你的推论,比 STL 之运用程度,比监控设施,
比运转记录(loging),比文件内容。
小弟的程序:
#include <iostream>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
typedef vector<vector<int> > Matrix;
template<typename T>
void init_vec(vector<T> &vec, int n);
bool check(const Matrix &matrix, int l, int n);
void print(ostream &os, const Matrix &matrix);
int input();
class print_vec { //functor for print a vector
public:
print_vec(ostream &rhs = cout):os_(rhs) {}
template<typename T>
void operator ()(const vector<T> &vec) {
copy(vec.begin(), vec.end(), ostream_iterator<T>(os_, " "));
os_ << "\n";
}
private:
ostream &os_;
};
int main()
{
ofstream os("result.txt");
if(!os) {
cout << "Open output file failed!" << endl;
exit(1);
}
int n = input();
Matrix matrix(n);
clock_t ct_start;
ct_start = clock();
int total = 0;
int l = 0;
bool need_init = true;
while(l >= 0) {
bool is_available;
if (need_init)
init_vec(matrix[l], n);
do {
if (is_available = check(matrix, l, n))
break;
} while(next_permutation(matrix[l].begin(), matrix[l].end()));
if(is_available) { //回溯条件
need_init = true;
++l;
} else {
need_init = false;
--l; //回溯
}
if (l == n) { //找到一组解
--l; //回溯
os << "Number." << ++total << '\n';
print(os, matrix);
need_init = false;
}
while(!(need_init || next_permutation(matrix[l].begin(), matrix[l].end()) )){
--l;
if (l == -1)
break;
}
}
cout << "\nFound " << total << " solutions. \n" ;
cout << "The elapsed time is: " << ((double)clock() - ct_start) / CLK_TCK << endl;
}
template<typename T>
void init_vec(vector<T> &vec, int n)
{ // initialize a vector
vec.clear();
for(int i = 0; i < n; ++i)
vec.push_back(i);
}
bool check(const Matrix &matrix, int l, int n)
{ //check the request
for( int i = 0; i <= l - 1; ++i)
for (int j = i + 1; j <= l; j++) {
if (!inner_product(matrix[i].begin(), matrix[i].end(), matrix[j].begin(), 1, multiplies<int>(), minus<int>()))
return false;
}
for( int i = 0; i <= l - 1; ++i)
for (int j = i + 1; j <= l; j++) {
if (matrix[i][i] == matrix[j][j] || matrix[i][n-i-1] == matrix[j][n-j-1])
return false;
}
return true;
}
void print(ostream &os, const Matrix &matrix)
{
for_each(matrix.begin(), matrix.end(), print_vec(os));
os << endl;
}
int input()
{
int n;
do {
cout << "Input the dimension (1~7) : " ;
cin >> n;
if (n == -1)
exit(0);
if (n < 1 || n > 7)
cout << "Out of range, try again or -1 to exit.\n";
} while(n < 1 || n > 7);
return n;
}
严格地分析解的个数需要用到组合数学,但我没有学过,下面粗略地分析一下:
当n == 4时,程序运行结果为48个解,发现第一行的每一个不同排列对应2个解,所以理论上该有2 * 4! = 48个解,吻合。
当n == 5时,程序运行结果为960个解, 发现第一行的每一个不同排列对应8个解,所以理论上该有128 * 5! = 960个解,吻合。
当n == 6时,程序运行好慢,半个多小时只出了10000个解。发现第一行的每一个不同排列对应128个解,所以理论上该有128 * 6! = 92160个解。
当n == 7时,估计第一行的每一个不同排列对应8192 ~ 32786个解,所以理论上该有8192 * 6! = 41287680或165150720个解,请懂组合数学的网友指正。
相关推荐
产业园区运营负责人如何提升园区内企业技术需求的响应效率?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
产业园区运营负责人如何精准对接企业技术需求与科研资源?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
职业技能竞赛技术文件 评分采用主观评价与客观测量相结合的方式,并依据特定优先级处理成绩并列情况
; 阅读建议:此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案设计,所以在学习的过程要结合这些内容一起来实践,并调试对应的代码。
基于https://github.com/can1357/oh-my-pi 实现 rpc agent
基于https://github.com/can1357/oh-my-pi 实现 rpc agent
TFGEN network testing tool
源码链接: https://pan.quark.cn/s/3010d7c65ee5 TFGEN网络测试工具是一种功能强大的流量生成解决方案,主要用于对网络性能及稳定性进行评估。该工具能够支持单一节点通信、多节点组播以及广播式数据传输的生成,为网络管理员和开发人员提供了一种有效验证网络设备与协议处理效能的途径。 在详细探讨TFGEN之前,有必要先明确网络测试的定义。网络测试是指对网络性能、可靠程度及安全防护能力进行系统性评估的过程,其目的是确保网络设施能够正常运行,满足用户使用要求,并在问题发生时进行故障诊断。TFGEN在网络测试领域的应用主要是通过模拟多种类型的网络流量,用以检测网络在不同负载条件下的运行状态。 TFGEN的核心功能包含以下方面: 1. **流量模拟**:TFGEN能够生成具有可调整参数的网络流量,如数据包尺寸、传输速率、协议种类等,用以模拟现实环境中的网络活动。这对于检验网络设备的带宽分配、拥塞管理以及服务质量策略的执行效果具有关键意义。 2. **多模式流量支持**:TFGEN兼容单一节点、多节点组播和广播这三种流量模式,使其能够适应多样化的应用场景。单一节点通信适用于点对点的数据交换,组播机制适合高效的一对多数据传输,而广播通常用于局域网内的信息传播和故障定位。 3. **参数可调性**:用户可通过修改参数来设定测试环境,例如设定传输速率、数据包时间间隔、源地址与目标地址等,从而更精确地再现特定的网络状况。 4. **资料文档**:附带的`changelog`文件记录了TFGEN的版本迭代历史,用户可通过此了解软件的改进与新增特性;`tfgen.hlp`文件提供使用TFGEN的详细说明和操作指南;`install.txt`文档则包含了安...


