这道问题来自于学校的oj平台
我用C++,课上讲的递归算法来计算:沿最后一行展开,归结为维度-1的行列式计算
下面是代码:
#include<iostream>
using namespace std;
int power(int n,int m) {
int result = 1;
for(int i = 1;i <= n+m;i++){
result = result * (-1);
}
return result;
}
int count(int N, int m[7][7],int judge[7]) {
if (N == 1) {
int ans1 = 0;
for (int i = 1;i <= 6;i++) {
ans1 = ans1+judge[i] * m[1][i];
}
return ans1;
}
else {
int ans2=0;
for (int j = 1;j <= 6;j++) {
if (judge[j] == 1) {
int part1 = power(N, j) * m[N][j] ;
judge[j] = 0;
int part2 = count(N - 1, m, judge);
ans2 +=part1 * part2;
judge[j] = 1;
}
}
return ans2;
}
}
int main() {
int N;
cin >> N;
int a[7][7];
int judge[7] = {0,0,0,0,0,0,0};
for (int i = 1;i <= N;i++) {
judge[i] = 1;
}
for (int i = 1;i <= N;i++) {
for (int j = 1;j <= N; j++) {
cin >> a[i][j];
}
}
cout << count(N, a, judge);
}
但是发现程序有bug,交到oj上始终只有一半分
但是找了好久也找不出bug,请问究竟是哪里错了?
拉普拉斯展开中,
对应的小矩阵是原矩阵删去第i行和第j列,你没有表达出来这个概念
非常感谢您!
可是我还是没有搞懂:在中间这一段程序中,我每次都是沿最后一行展开,并把函数中的参数从N改为N-1,就是删掉了最后一行;我把判断第j列有没有包括的judge[ j ]改为0,就是删掉了第 j 列,应该是已经表达了这个概念了呀!还是不知道为什么错qwq
恳请指教
啊啊啊终于想懂了bug是什么
在删掉中间的列的时候,没有把左边的部分和右边的部分并在一起,导致-1的次方出了问题!
非常感谢@Soda Wang