此图片转自
算是我学习蓝桥杯时遇到的第一个算法吧,是老师发给我们的,我记得当时我刚学了差不多一个月,还在纠结如何把for练好,现在回想已经快半年了,因为学的c语言的原因,这个题目一直看不懂(文章使用java写的,现在也不是很懂)所以今天打算自己试试能不能解决!也算是对自己学习三个月算法的一个练习。
方法一:全排列,暴力枚举
思路:就个数的排列组合为9!所以我们可以先用全排列算法把所有的组合写出了,然后将这个组合数三个一组切开,例如:123456789 切开后123 456 789 切成三行,接下来只需要验证这个切法的行,列,对角线是否为15即可!!
废话不多说上代码!
#include <iostream>
using namespace std;
int Map[3][3];
int Num[9] = {1,2,3,4,5,6,7,8,9};
int ans = 0;
bool Judge(int a[])
{
int flag[8];
flag[0] = a[0] + a[1] + a[2];
flag[1] = a[3] + a[4] + a[5];
flag[2] = a[6] + a[7] + a[8];
if(flag[0] == 15 && flag[1] == 15 && flag[2] == 15){
flag[3] = a[0] + a[3] + a[6];
flag[4] = a[1] + a[4] + a[7];
flag[5] = a[2] + a[5] + a[8];
flag[6] = a[0] + a[4] + a[8];
flag[7] = a[6] + a[4] + a[2];
for(int i = 3; i < 8; ++i){
if(flag[i] == 15) continue;
else return false;
return true;
}
}
else return false;
}
//全排列代码
void FullArrangement(int begin, int a[])
{
if(begin == 9){
if(Judge(a) == true){
ans++;
cout << "满足条件的第"<< ans <<"个行列式" << endl;
for(int k = 0; k < 9; ++k){
cout << a[k];
if((k + 1) % 3 == 0) cout << endl;
}
}
}
else{
for(int i = begin; i < 9; ++i){
swap(a[i], a[begin]); //用c++自带的swap
FullArrangement(begin + 1, a);
swap(a[i],a[begin]);
}
}
}
int main()
{
int Num[9] = {1,2,3,4,5,6,7,8,9};
FullArrangement(0, Num);
return 0;
}
写完我才发现其实全排列运用的就是(dfs)思想,写的时候没有发现,哈哈,这样也好下次写就知道类比了,出错概率就小了,整个算法写了40分钟看来还要提提速度!!
这个纯小白(毕竟作者也就学了半年),时间复杂度没有考虑,思路简单,当然就是时间复杂度高。小白,纯练手。