存板子
double-高斯消元:link
#include
#include
#include
#include
#define LL long long
using namespace std;
const int MAXN = 105;
const double eps = 1e-6;
int N, M, n, m, u, all, k;
bool fr[MAXN];
double a[MAXN][MAXN], A[MAXN][MAXN], val[MAXN];
double Fabs(double x) { return x > 0 ? x : -x; }
void Gauss() {
int r = 1, c = 1;
for(; r <= m && c <= n; r ++, c ++) {
int maxx = r;
for(int j = r + 1; j <= m; j ++) if(Fabs(a[j][c]) > Fabs(a[maxx][c])) maxx = j;
for(int j = 1; j <= n + 1; j ++) swap(a[maxx][j], a[r][j]);
if(Fabs(a[r][c]) < eps) { r --; continue; }
for(int j = 1; j <= m; j ++) {
if(j == r) continue;
double g = a[j][c] / a[r][c];
for(int k = 1; k <= n + 1; k ++) a[j][k] -= a[r][k] * g;
}
}
all = r - 1;
}
bool Check() {
for(int i = all + 1; i <= m; i ++) if(Fabs(a[i][n + 1]) > eps) return 0;
for(int i = 1; i <= n; i ++) fr[i] = 1;
for(int i = 1; i <= all; i ++) {
int num = 0, cnt = 0;
for(int j = 1; j <= n; j ++) if(Fabs(a[i][j]) > eps && fr[j]) cnt ++, num = j;
if(cnt == 1) fr[num] = 0, val[num] = a[i][n + 1] / a[i][num];
}
return 1;
}
int main() {
bool fuck = 0;
while(~scanf("%d%d%d", &N, &M, &k)) { // 注意 k=0, n/m!=0时不能 return
if(N == 0 && M == 0 && k == 0) return 0;
if(fuck) printf("\n");
n = m = 0; fuck = 1; swap(N, M);
for(int i = 1; i <= N; i ++) for(int j = 1; j <= M; j ++) scanf("%lf", &A[i][j]);
for(int i = 1; i <= N * M; i ++) for(int j = 1; j <= N * M; j ++) a[i][j] = 0;
for(int i = 1; i <= N; i ++) {
for(int j = 1; j <= M; j ++) {
double cnt = 0; m ++; a[m][N * M + 1] = A[i][j];
for(int u = 1; u <= N; u ++) {
for(int v = 1; v <= M; v ++) {
int t = abs(i - u) + abs(j - v);
if(t <= k) cnt ++;
}
}
for(int u = 1; u <= N; u ++) {
for(int v = 1; v <= M; v ++) {
int t = abs(i - u) + abs(j - v);
if(t <= k) a[m][(u - 1) * M + v] = 1 / cnt;
}
}
}
}
n = N * M;
Gauss(); Check();
for(int i = 1; i <= N; i ++) {
for(int j = 1; j <= M; j ++) {
double t = val[(i - 1) * M + j]; int g = t * 100;
if(g == 0) printf("%8.2lf", 0.00);
else printf("%8.2lf", t);
}
printf("\n");
}
}
return 0;
}
bool-高斯消元:link
#include
#include
#include
#include
#include
#include
#define LL long long
#define uint unsigned int
using namespace std;
const int MAXN = 2e3 + 5, inf = 0x3f3f3f3f;
// sb
int n, m, id[MAXN], all, col[MAXN];
char s[MAXN];
bitset a[MAXN];
bool gauss() {
int r = 1, c = 1;
for(; r <= m && c <= n; r ++, c ++) {
int mn = inf, wh = inf;
for(int i = r; i <= m; i ++) if(a[i][c] && id[i] < mn) mn = id[i], wh = i;
// printf("---\n");
// for(int i = 1; i <= m; i ++) {
// for(int j = 1; j <= n + 1; j ++) printf("%d", a[i][j] & 1);
// printf("\n");
// }
// printf("---\n");
// printf("|%d %d %d|\n", r, c, mn);
if(mn == inf) return 1;
swap(a[wh], a[r]); swap(id[wh], id[r]);
for(int i = 1; i <= m; i ++) {
if(i == r || !a[i][c]) continue;
a[i] ^= a[r];
}
}
all = r - 1; return 0;
}
void chk() {
// 此处一般的还要在 all+1~m 的 n+1 处判断合法性
//for()
}
int main() {
int f;
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i ++) {
scanf("%s%d", s + 1, &f); id[i] = i;
for(int j = 1; j <= n; j ++) a[i][j] = s[j] - '0';
a[i][n + 1] = f;
}
if(gauss()) { printf("Cannot Determine"); return 0; }
chk(); int res = 0;
for(int i = 1; i <= n; i ++) res = max(res, id[i]);
printf("%d\n", res);
for(int i = 1; i <= n; i ++) {
if(a[i][n + 1]) printf("?y7M#\n");
else printf("Earth\n");
}
return 0;
}