此图片转自
算是我学习蓝桥杯时遇到的第一个算法吧,是老师发给我们的,我记得当时我刚学了差不多一个月,还在纠结如何把for练好,现在回想已经快半年了,因为学的c语言的原因,这个题目一直看不懂(文章使用java写的,现在也不是很懂)所以今天打算自己试试能不能解决!也算是对自己学习三个月算法的一个练习。
方法一:全排列,暴力枚举
思路:就个数的排列组合为9!所以我们可以先用全排列算法把所有的组合写出了,然后将这个组合数三个一组切开,例如:123456789 切开后123 456 789 切成三行,接下来只需要验证这个切法的行,列,对角线是否为15即可!!
废话不多说上代码!
#includeusing 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分钟看来还要提提速度!!
这个纯小白(毕竟作者也就学了半年),时间复杂度没有考虑,思路简单,当然就是时间复杂度高。小白,纯练手。



