1 介绍
本专题用来记录高斯消元相关题目。
2 训练
题目1:207球形空间产生器
C++代码如下,
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 15;
int n;
double a[N][N], b[N][N];
void gauss() {
for (int r = 1, c = 1; c <= n; ++c, ++r) {
int t = r;
for (int i = r + 1; i <= n; ++i) {
if (fabs(b[i][c]) > fabs(b[t][c])) {
t = i;
}
}
for (int i = c; i <= n + 1; ++i) swap(b[t][i], b[r][i]);
for (int i = n + 1; i >= c; --i) b[r][i] /= b[r][c];
for (int i = r + 1; i <= n; ++i) {
for (int j = n + 1; j >= c; --j) {
b[i][j] -= b[i][c] * b[r][j];
}
}
}
for (int i = n; i > 1; --i) {
for (int j = i - 1; j; --j) {
b[j][n+1] -= b[i][n+1] * b[j][i];
b[j][i] = 0;
}
}
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n + 1; ++i) {
for (int j = 1; j <= n; ++j) {
scanf("%lf", &a[i][j]);
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
b[i][j] += 2 * (a[i][j] - a[0][j]);
b[i][n+1] += a[i][j] * a[i][j] - a[0][j] * a[0][j];
}
}
gauss();
for (int i = 1; i <= n; ++i) printf("%.3lf ", b[i][n+1]);
return 0;
}
题目2:208开关问题
C++代码如下,
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 35;
int n;
int a[N][N];
int gauss() {
int r, c;
for (r = 1, c = 1; c <= n; c++) {
int t = r;
for (int i = r + 1; i <= n; ++i) {
if (a[i][c]) t = i;
}
if (!a[t][c]) continue;
for (int i = c; i <= n + 1; ++i) swap(a[t][i], a[r][i]);
for (int i = r + 1; i <= n; ++i) {
for (int j = n + 1; j >= c; --j) {
a[i][j] ^= a[i][c] & a[r][j];
}
}
r++;
}
int res = 1;
if (r < n + 1) {
for (int i = r; i <= n; ++i) {
if (a[i][n+1]) return -1;
res *= 2;
}
}
return res;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
memset(a, 0, sizeof a);
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i][n+1]);
for (int i = 1; i <= n; ++i) {
int t;
scanf("%d", &t);
a[i][n+1] ^= t;
a[i][i] = 1;
}
int x, y;
while (scanf("%d%d", &x, &y), x || y) a[y][x] = 1;
int t = gauss();
if (t == -1) puts("Oh,it's impossible~!!");
else printf("%d\n", t);
}
return 0;
}