小蒟蒻开始做概率的题之后,遇到了这道题,然而,他发现自己的程序调试了无数次也无法通过,系统总是返回令人伤心的WA,

于是,他决定把这一天半的时间收集到的资料放在网上, 寻求大家的帮助, 也可以节省后来人的时间.

题目描述和题解就不写了.

易错数据:

1 4
$#99
1 4
A5a$
2 3
$aA
1##
3 3
4A#
##$
1a!

大数据:

15 15
$A.............
aaaaaaaaaaaaaa.
.........#!1...
.aaaaaaaaaaaaaa
...............
aaaaaaaaaaaaaa.
...............
.aaaaaaaaaaaaaa
...............
aaaaaaaaaaaaaa.
...............
.aaaaaaaaaaaaaa
...............
aaaaaaaaaaaaaa.
...............

答案为:12.00000

15 15
.......#.......
........#.3....
...$.....#..#..
..........#..#.
..........#.#..
...........a...
##########.#.##
Z!.......#...#.
!.........###..
...............
..............b
###...3....###.
.z#........#...
..###.....#....
...B#....#...A.

答案为:3.24303821

我的错误程序

#include <cstdio>
#include <cctype>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <utility>
#include <queue>
#include <vector>
#define F(i, j, k) for(int i = j; i <= k; ++i)
typedef long double val_t;
using std::queue;
using std::pair;
using std::cout;
#define mp std::make_pair
int n, m, N, cnt, sx, sy;
const int maxn = 20;
const val_t eps = 1e-7;
const int life = 3;
const int maxm = maxn * maxn * life;
char a[maxn][maxn];
val_t mat[maxm][maxm];
pair<int, int> coin[maxm], out[26];
std::vector<pair<int, int> > in[26];
bool vis[maxn][maxn], vis2[maxn][maxn];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
inline bool ok(int x, int y) {
return (x >= 1 && x <= n && y >= 1 && y <= m && a[x][y] != '#');
}
inline int numb(int k, int i, int j) {
int x = n * m;
return (k - 1) * x + (i - 1) * m + j;
}
void pre() {
scanf("%d %d", &n, &m);
N = life * n * m;
F(i, 1, n) {
scanf("%s", a[i] + 1);
F(j, 1, m) {
if(a[i][j] == '$') sx = i, sy = j;
if(a[i][j] >= 'A' && a[i][j] <= 'Z') out[a[i][j] - 'A'] = mp(i, j);
if(a[i][j] >= 'a' && a[i][j] <= 'z') in[a[i][j] - 'a'].push_back(mp(i,j));
if(a[i][j] >= '0' && a[i][j] <= '9') coin[++cnt] = mp(i, j);
}
}
}
bool bfs(int x, int y) {
if(!ok(x,y)) return false;
queue<pair<int, int> > q;
memset(vis2, 0, sizeof(vis2));
vis2[x][y] = 1;
q.push(mp(x,y));
while(!q.empty()) {
int u = q.front().first;
int v = q.front().second;
q.pop();
if(islower(a[u][v])) {
if(!vis2[out[a[u][v] - 'a'].first][out[a[u][v] - 'a'].second]) {
vis2[out[a[u][v] - 'a'].first][out[a[u][v] - 'a'].second] = 1;
q.push(out[a[u][v] - 'a']);
}
continue;
}
if(isdigit(a[u][v])) return true;
F(k, 0, 3) {
int du = u + dx[k];
int dv = v + dy[k];
if(du >= 1 && du <= n && dv >= 1 && dv <= m && a[du][dv] != '#' && !vis2[du][dv]) {
vis2[du][dv] = 1;
q.push(mp(du, dv));
}
}
}
return false;
}
void build_formula() {
F(k, 1, life) F(i, 1, n) F(j, 1, m)
if(!vis[i][j]) {
mat[numb(k, i, j)][numb(k, i, j)] = 1;
} else if(a[i][j] >= 'a' && a[i][j] <= 'z') {
mat[numb(k, i, j)][numb(k, i, j)] = 1;
mat[numb(k, i, j)][numb(k, out[a[i][j] - 'a'].first, out[a[i][j] - 'a'].second)] = -1;
} else {
if(a[i][j] >= '0' && a[i][j] <= '9') mat[numb(k, i, j)][N+1] = -(a[i][j] - '0');
mat[numb(k, i, j)][numb(k, i, j)] = -1;
int p = 0;
F(K, 0, 3) {
int di = i + dx[K];
int dj = j + dy[K];
if(di >= 1 && di <= n && dj >= 1 && dj <= m && a[di][dj] != '#') p++;
}
F(K, 0, 3) {
int di = i + dx[K];
int dj = j + dy[K];
if(di >= 1 && di <= n && dj >= 1 && dj <= m && a[di][dj] != '#'){
if(a[di][dj] != '!')mat[numb(k, i, j)][numb(k, di, dj)] = 1.0 / p;
else if(k != 1) mat[numb(k,i,j)][numb(k-1,di,dj)] = 1.0 / p;
}
}
}
}
void print() {
printf("======================\n");
F(i, 1, N) {
F(j, 1, N) printf("%5.2Lf ", mat[i][j]);
printf("|");
printf("%5.2Lf\n", mat[i][N+1]);
}
printf("======================\n");
}
bool fl[maxm];
val_t gauss() {
F(i, 1, N) {
int r = i;
F(j, i + 1, N) if(fabsl(mat[j][i]) > fabsl(mat[r][i])) r = j;
if(r != i) F(j, 1, N+1) std::swap(mat[r][j], mat[i][j]);
F(j, i + 1, N) if(fabsl(mat[i][i]) > eps){
val_t t = 1.0 * mat[j][i] / mat[i][i];
F(k, 1, N+1) mat[j][k] -= mat[i][k] * t;
}
else fl[i] = 1;
}
for(int i = N; i >= 1; i--) {
for(int j = N; j > i; j--) {
if(mat[i][j] && !fl[j]) mat[i][N+1] -= mat[j][N+1] * mat[i][j];
else if(mat[i][j] && fl[j]) fl[i] = 1;
}
if(fabsl(mat[i][i]) > eps) mat[i][N+1] /= mat[i][i];
else fl[i] = 1;
}
if(fl[numb(life,sx,sy)]) return -1;
return mat[numb(life,sx,sy)][N+1];
}
int main() {
#ifdef orz
freopen("input", "r", stdin);
#endif
pre();
F(i, 1, n) {
F(j, 1, m) {
vis[i][j] = bfs(i, j);
}
}
build_formula();
val_t ans = gauss();
if(ans != -1) printf("%.9Lf\n", ans);
else printf("-1\n");
return 0;
}

标程

#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std; typedef long double real; const real eps = 1e-12;
const char Empty = '.';
const char Monster = '!';
const char Wall = '#';
const char Mario = '$';
const int maxv = 800;
const int mx[4] = {0, 1, 0, -1};
const int my[4] = {-1, 0, 1, 0}; int extX[27], extY[27];
char map[17][17];
int n, m, sx, sy, tmp; int isbegin(char s) {
if((s >= 'a') && (s <= 'z')) return s - 'a' + 1;
return 0;
} int isend(char s) {
if((s >= 'A') && (s <= 'Z')) return s - 'A' + 1;
return 0;
} int money(char s) {
if((s >= '0') && (s <= '9')) return s - '0';
return 0;
} void init() {
char s[100];
scanf("%d%d\n", &n, &m);
memset(map, '#', sizeof(map)); int i, j, k;
for(i = 1; i <= n; i++) {
scanf("%s", s);
for(j = 1; j <= m; j++) {
if( (map[i][j] = s[j-1]) == Mario) {
sx = i;
sy = j;
}
if(k = isend(s[j-1])) {
extX[k] = i;
extY[k] = j;
}
}
}
} int qx[maxv], qy[maxv], ql[maxv];
int isvisit[16][16][3];
int l, r; int go[maxv][4], gd[maxv], cango[maxv];
vector<int> reach[maxv]; int Queue_Insert(int x, int y, int life) {
if( map[x][y] == Wall ) return 0;
if( map[x][y] == Monster) life--;
if(life < 0) return 0;
if(tmp = isbegin(map[x][y])) {
x = extX[tmp];
y = extY[tmp];
} if(isvisit[x][y][life] == 0) {
r++;
qx[r] = x;
qy[r] = y;
ql[r] = life;
isvisit[x][y][life] = r;
} return isvisit[x][y][life];
} void bfs() {
l = r = 0;
Queue_Insert(sx, sy, 2);
int nx, ny, nl;
int d; while(l < r) {
l++;
nx = qx[l];
ny = qy[l];
nl = ql[l];
for(d = 0; d < 4; d++) if(map[nx + mx[d]][ny + my[d]] != Wall) {
cango[l]++;
tmp = Queue_Insert(nx + mx[d], ny + my[d], nl);
if(tmp) go[l][gd[l]++] = tmp, reach[tmp].push_back(l);
}
}
} real mat[maxv][maxv];
real matans[maxv];
real res[maxv];
int Mnum[maxv]; bool solve(int n) {
int i, j, k;
real tmp;
for(i = 1; i <= n; i++) {
j = i;
for(k = i + 1; k <= n; k++) if(fabs(mat[k][i]) > fabs(mat[j][i])) j = k;
if(fabs(mat[j][i]) < eps) return false;
for(k = i; k <= n+1; k++) swap(mat[i][k], mat[j][k]);
for(j = i + 1; j <= n; j++) if(fabs(mat[j][i]) > eps) {
tmp = mat[j][i] / mat[i][i];
for(k = i; k <= n+1; k++) mat[j][k] -= tmp * mat[i][k];
}
} for(i = n; i; i--) {
matans[i] = -mat[i][n+1];
for(j = i + 1; j <= n; j++) matans[i] -= mat[i][j] * matans[j];
matans[i] /= mat[i][i];
}
return true;
} bool will[maxv];
void dfs(int x) {
if(will[x]) return;
will[x] = true;
for(int i = 0; i < reach[x].size(); i++) dfs(reach[x][i]);
}
void work() {
int tot, i, j, k, x;
for(i = 1; i <= r; i++) if(money(map[qx[i]][qy[i]])) dfs(i);
for(int ll = 0; ll <= 2; ll++) {
tot = 0;
for(i = 1; i <= r; i++) if((ql[i] == ll) && (will[i])) Mnum[i] = ++tot; for(i = 1; i <= tot; i++)
for(j = 1; j <= tot+1; j++) mat[i][j] = 0;
k = 0;
for(i = 1; i <= r; i++) if((ql[i] == ll) && (will[i])) {
k++;
mat[k][k] = -cango[i];
mat[k][tot+1] = money(map[qx[i]][qy[i]])* cango[i];
for(j = 0; j < gd[i]; j++) {
x = go[i][j];
if( (ql[x] != ll) || (!will[x])) mat[k][tot+1] += res[x];
else mat[k][Mnum[x]]++;
}
} if(!solve(tot)) {
printf("-1\n");
return;
}
for(int i = 1; i <= r;i++) if(ql[i] == ll) res[i] = matans[Mnum[i]];
}
cout << res[1] << endl;
}
int main() {
#ifdef orz
freopen("input", "r", stdin);
#endif
cout.setf(ios::fixed);
cout.precision(10);
init();
bfs();
work();
return 0;
}

数据生成器

#include <cstdio>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <cstring>
#define random(x) (rand() % x) + 1
int vis[27], color;
int main() {
memset(vis, 0, sizeof(vis));
srand(time(NULL));
int n = 15, m = 15;
color = 2;
int sx = random(n);
int sy = random(m);
printf("%d %d\n", n, m);
for(int i = 1; i <= n; i++) {
for(int j =1; j<=m; j++) {
if(i == sx && j == sy) {
printf("%c",'$');
continue;
}
int k = random(6);
here:
if(k == 1) printf("%c", '#');
if(k == 2) {
int x = random(color);
int cnt = 0;
while(vis[x]) {
x = random(color);
cnt++;
if(cnt > color) {
k = random(6);
goto here;
}
}
vis[x] = 1;
printf("%c", 'A' + x - 1);
}
if(k == 3) {
int x = random(3);
int cnt = 0;
while(!vis[x]){
x = random(color);
cnt++;
if(cnt > color) {
k = random(6);
goto here;
}
}
printf("%c", 'a' + x - 1);
}
if(k == 4) printf("%c", '!');
if(k == 5) printf(".");
if(k == 6) printf("%d", random(9));
}
printf("\n");
}
return 0;
}

对拍器

和标程对拍了5000组数据没有出错QAQ

from math import *
import time
import os
n = input()
for i in range(1,int(n)+1):
os.system('./r > input')
if(os.system('./a < input > output.a') != 0):
break
os.system('./b < input > output.b')
f1 = open('output.a', 'r')
f2 = open('output.b', 'r')
x1 = float(f1.readline())
x2 = float(f2.readline())
flag = 0
if(fabs(x1 - x2) > 1e-6):
flag = fabs(x1 - x2)
if flag > 0:
print('Incorrect:{}'.format(flag))
break
else:
print('Correct {}/{}: my answer is {}, his answer is {}'.format(i, n, x1, x2))
#time.sleep(1)

如果有同学看出了我程序的错误, 欢迎联系我:

mail:unrealgengchen@gmail.com

QQ:543249426

[求助][SPOJ MARIOGAM]-高斯消元(内含标程,数据等)的更多相关文章

  1. SPOJ HIGH(生成树计数,高斯消元求行列式)

    HIGH - Highways no tags  In some countries building highways takes a lot of time... Maybe that's bec ...

  2. 单(single):换根dp,表达式分析,高斯消元

    虽说这题看大家都改得好快啊,但是为什么我感觉这题挺难.(我好菜啊) 所以不管怎么说那群切掉这题的大佬是不会看这篇博客的所以我要开始自嗨了. 这题,明显是树dp啊.只不过出题人想看你发疯,询问二合一了而 ...

  3. SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元

    [题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...

  4. 【SPOJ 104】HIGH - Highways (高斯消元)

    题目描述 In some countries building highways takes a lot of time- Maybe that's because there are many po ...

  5. [Sdoi2017]硬币游戏 [高斯消元 KMP]

    [Sdoi2017]硬币游戏 题意:硬币序列,H T等概率出现,\(n \le 300\)个人猜了一个长为$ m \le 300$的字符串,出现即获胜游戏结束.求每个人获胜概率 考场用了[1444: ...

  6. HDU2449 Gauss Elimination 高斯消元 高精度 (C++ AC代码)

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU2449.html 题目传送门 - HDU2449 题意 高精度高斯消元. 输入 $n$ 个 $n$ 元方程 ...

  7. hihoCoder#1196 : 高斯消元·二(开关灯问题)

    传送门 高斯消元解异或方程组 小Ho在游戏板上忙碌了30分钟,任然没有办法完成,于是他只好求助于小Hi. 小Ho:小Hi,这次又该怎么办呢? 小Hi:让我们来分析一下吧. 首先对于每一个格子的状态,可 ...

  8. Codeforces 1163E 高斯消元 + dfs

    题意:给你一个集合,让你构造一个长度尽量长的排列,使得排列中任意相邻两个位置的数XOR后是集合中的数. 思路:我们考虑枚举i, 然后判断集合中所有小于1 << i的数是否可以构成一组异或空 ...

  9. 算法竞赛进阶指南0x35高斯消元与线性空间

    高斯消元 目录 高斯消元 ACWing207. 球形空间产生器(点击访问) 求解思路 代码 ACWing208. 开关问题(点击访问) 思路 代码 总结 欣赏 线性空间 定义 ACWing209. 装 ...

随机推荐

  1. css3图片动画旋转

    body{ background-color:#021E36; text-align: center; } .container{margin:500px auto;} .round{position ...

  2. 《并行程序设计导论》——OpenMP

    OpenMP看着很好,实际上坑很多. 如果真的要求性能和利用率,还是专门写代码吧.而且MS的VS里只有2.X的版本.

  3. 图像变换之Census变换

    图像的Census变换 Census变换属于非参数图像变换的一种,它能够较好地检测出图像中的局部结构特征,如边缘.角点特征等.传统Census变换的基本思想是:在图像区域定义一个矩形窗口,用这个矩形窗 ...

  4. spring问题:java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutPrimitive

    问题描述: spring的:java.lang.NoClassDefFoundError: org/aspectj/weaver/tools/PointcutPrimitive 解决方案: 缺少jar ...

  5. 如何更改MyEclipse中XML文件的字体?

    windows>Preferences>General>Appearance>Colors and Fonts>Basic>Text Font

  6. flannel 网络问题排查

    1. 如果你发现 k8s容器无法访问外网? 重启docker 原因是,docker重启后会重新生成网桥.网络不通的原因是flannel启动后生成的网络覆盖了docker的网络,当你重启docker后, ...

  7. C# 将Access中时间段条件查询的数据添加到ListView中

    C# 将Access中时间段条件查询的数据添加到ListView中 一.让ListView控件显示表头的方法 在窗体中添加ListView 空间,其属性中设置:View属性设置为:Detail,Col ...

  8. python操作mysql,增,删,改,查

    import MySQLdb conn = MySQLdb.connect(host='192.168.1.21',user='yangqw',passwd='1',db='free')cur = c ...

  9. 记一些安卓app反编译修改的记录

    2017-12-2209:00:40 好几天没有写过博客了,因为马上要期末考试,只能暂且放下我的小玩物,专心复习我的期末考试. 今天突然想设置一个安卓的栏目,记录下自己从高中就爱玩的一些东西,像刷机呀 ...

  10. CSS深入理解学习笔记之line-height

    1.line-height的定义 定义:两行文字基线之间的距离. 注:不同字体之间的基线是不同的. 2.line-height与行内框盒子模型 行内框盒子模型: ①内容区域(content area) ...