存板子


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;
}