蓝桥杯 计算行列式 C++算法提高 HERODING的蓝桥杯之路

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  //据说很多人的题目会有一大堆废话,本傻×就不在这里废话了。
  给定一个N×N的矩阵A,求|A|。
输入格式
  第一行一个正整数N。
  接下来N行,每行N个整数,第i行第j个数字表示A[i][j]。
输出格式
  一行,输出|A|。
样例输入
2
1 2
3 4
样例输出
-2
数据规模和约定
  0<N≤6
  -10≤A[i][j]≤10
  
解题思路:
递归求解是计算行列式最简单的方式,分析,当阶数为一时,那结果就是本身,阶数为二,对角线相乘再相减,阶数为n呢?是不是特别复杂?如果用递归的思想,取得行列式的一个数,与它所包含的数相乘即可,至于正负号判定通过你取的数的位置判定,所包含的数不知道怎么办?不用考虑,递归即可。总结思路可以用如下公式表示:

  • n = 1 时,Det(a) = a[0][0]
  • n = 2 时,Det(a) = a[0][0] * a[1][1] - a[1][0] * a[0][1]
  • n > 2 时,Det(a) = sum(a[0][i] * (-1)^i * 去掉a[0][i]所在行列的n-1阶行列式的值)

代码如下:

#include <bits/stdc++.h>
using namespace std;

int arr[10][10];


int getDet(int a[10][10], int n)  
{
	if(n == 1) return a[0][0];
	if(n == 2) return a[0][0] * a[1][1] - a[0][1] * a[1][0];
	int ans = 0;
	int tmp[10][10] = {0};
	for(int i = 0; i < n; ++ i)
	{
		for(int row = 0; row < n - 1; ++ row)
		{
			for(int col = 0; col < i; ++ col)
				tmp[row][col] = a[row + 1][col];
			for(int col = i; col < n - 1; ++ col)
				tmp[row][col] = a[row + 1][col + 1];
		}
		ans += a[0][i] * getDet(tmp, n - 1) * (i % 2 == 0 ? 1 : -1);
	}
	return ans;
}


int main()
{
	int n;
	while(cin >> n)
	{
		for(int i = 0; i < n; ++ i)
		{
			for(int j = 0; j < n; ++ j) 
			{
				cin >> arr[i][j];
			}
				
		}			
		cout << getDet(arr, n);
	}
	return 0;	
} 


感谢大佬的思路:https://blog.csdn.net/qq_40531479/article/details/103868042

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/107236648