HDU_3359 Kind of a Blur 【浮点型高斯消元+BFS】
一、题目
二、分析
题目读起来挺费劲的。
主要就是要求一个矩阵,其中每个点及其于这个的曼哈顿距离小于D的点的值总和的平均值就是新生成的矩阵。
给定新生成的矩阵,求初始矩阵。
相当于就是一个点的值与多个点的值相关联,那么列一个(WH)列,(WH)个未知数的方程组,然后解方程就可以了,由于值是浮点型,那么就是浮点型的高斯消元。
三、AC代码
#include <bits/stdc++.h> using namespace std;
#define ll long long
#define Min(a,b) ((a)>(b)?(b):(a))
#define Max(a,b) ((a)>(b)?(a):(b)) const int maxn = 2e2 + 20;
const double eps = 1e-7;
int W, H, D;
double M[20][20]; class GaussMatrix
{
public:
double a[maxn][maxn];
int equ, val; //行数、列数
void swapRow(int rowOne, int rowTwo)
{
for(int i = 1; i <= val; ++i)
{
swap(a[rowOne][i], a[rowTwo][i]);
}
}
void swapCol(int colOne, int colTwo)
{
for(int i = 1; i <= equ; ++i)
{
swap(a[i][colOne], a[i][colTwo]);
}
}
bool same(double x, double y)
{
return fabs(x - y) < eps;
}
int guass()
{
int k, col;
for(k = 1, col = 1; k <= equ && col < val; k++, col++)
{
//找到[k, equ]行中,col列值最大的行
int maxRow = k;
for(int i = k + 1; i <= equ; i++)
{
if(fabs(a[i][col]) > fabs(a[maxRow][col]))
{
maxRow = i;
}
}
//如果col列都为0,直接处理下一列
if(same(a[maxRow][col], 0))
{
--k;
continue;
}
if(maxRow != k)
swapRow(k, maxRow);
//约掉最上面这行约数,是当前行第col列第一个数系数为1
for(int i = col + 1; i <= val; i++)
{
a[k][i] /= a[k][col];
}
a[k][col] = 1.0;
//消元
//1*x + b*y + c*z = d1
//a2*x + b2*y + c2*z = d2
//a3*x + b3*y + c3*z = d3
for(int i = 1; i <= equ; i++)
{
if(i == k)
continue;
for(int j = col + 1; j <= val; j++)
{
a[i][j] -= a[i][col]*a[k][j];
}
a[i][col] = 0.0;
}
}
//扫描一下剩下的行,如果有解,则应全部都被消为了0
for(k; k <= equ; k++)
{
if(!same(a[k][val], 0))
return -1;
}
return val - k;
}
}arr; struct node
{
int x, y, len;
node(int a, int b, int l)
{
x = a, y = b;
len = l;
}
};
bool visited[20][20];
const int dx[] = {0, -1, 0, 1};
const int dy[] = {1, 0, -1, 0}; int toHash(int i, int j)
{
return (i-1)*W + j;
} bool judge(int x, int y)
{
if( !visited[x][y] && x > 0 && x <= H && y > 0 && y <= W)
return true;
return false;
} void init(int x, int y, int row)
{
memset(visited, 0, sizeof(visited));
queue<node> que;
memset(visited, 0, sizeof(visited));
que.push(node(x, y, 0));
int has = 0;
while(!que.empty())
{
node t = que.front();
que.pop();
if(t.len <= D && judge(t.x, t.y))
{
arr.a[row][toHash(t.x, t.y)] = 1.0;
has++;
for(int i = 0; i < 4; i++)
{
que.push(node(t.x+dx[i], t.y+dy[i], t.len+1));
}
}
visited[t.x][t.y] = 1;
}
arr.a[row][W*H+1] = M[x][y]*has;
} void solve()
{
int cnt = 0;
arr.equ = W*H;
arr.val = W*H + 1;
memset(arr.a, 0, sizeof(arr.a));
for(int i = 1; i <= H; i++)
{
for(int j = 1; j <= W; j++)
{
init(i, j, ++cnt);
}
}
arr.guass();
int to = 1;
for(int i = 1; i <= H; i++)
{
for(int j = 1; j <= W; j++)
{
printf("%8.2lf", arr.a[to++][W*H+1]);
}
printf("\n");
}
} int main()
{
//freopen("input.txt", "r", stdin);
bool flag = 0;
while(scanf("%d%d%d", &W, &H, &D) != EOF)
{
if( !(W+H+D) )
break;
if(flag)
puts("");
else
flag = 1;
for(int i = 1; i <= H; i++)
{
for(int j = 1; j <= W; j++)
{
scanf("%lf", &M[i][j]);
}
}
solve();
}
return 0;
}
HDU_3359 Kind of a Blur 【浮点型高斯消元+BFS】的更多相关文章
- 期望dp+高斯消元+bfs——hdu4418
高斯消元又弄了半天.. 注意只要能建立矩阵,那就必定有解,所以高斯消元里可以直接return 1 #include<bits/stdc++.h> using namespace std; ...
- hdu 3359 Kind of a Blur (高斯消元 浮点型)
题目链接 题意: H * W (W,H <= 10) 的矩阵A的某个元素A[i][j],从它出发到其他点的曼哈顿距离小于等于D的所有值的和S[i][j]除上可达点的数目,构成了矩阵B.给定矩阵B ...
- HDU 3359 Kind of a Blur(高斯消元)
题意: H * W (W,H <= 10) 的矩阵A的某个元素A[i][j],从它出发到其他点的曼哈顿距离小于等于D的所有值的和S[i][j]除上可达点的数目,构成了矩阵B.给定矩阵B,求矩阵A ...
- HDU3359(SummerTrainingDay05-I 高斯消元)
Kind of a Blur Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- 【BZOJ-3270】博物馆 高斯消元 + 概率期望
3270: 博物馆 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 292 Solved: 158[Submit][Status][Discuss] ...
- *POJ 1222 高斯消元
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9612 Accepted: 62 ...
- [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...
- hihoCoder 1196 高斯消元·二
Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...
随机推荐
- 基础命令使用[win篇]
基础命令使用 [ win篇 ] 2017-11-05 WIN CMD 0x01 基础命令使用: 演示环境: 1 2 win2008R2cn ip: 192.168.3.23 假设为入侵者机器 ...
- HTML教程(看完这篇就够了)
HTML教程 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言.您可以使用 HTML 来建立自己的 WEB 站点,HTML 运 ...
- free online markdown editor
free online markdown editor markdown https://blog.csdn.net/xgqfrms/article/details/50129317 In-brows ...
- Chrome & targetText
Chrome & targetText target text http://www.ruanyifeng.com/blog/2019/03/weekly-issue-47.html http ...
- ORM & sequelize
ORM Object Relational Mapping 对象关系映射 Table => Object, 简化 SQL 查询命令的编写 https://en.wikipedia.org/wik ...
- MBP & battery
MBP & battery 实际:3 + 1 个小时左右 4 个小时左右 shit apple 10 小时 Chrome bug https://appleinsider.com/articl ...
- js 截取固定长度字符串但不打断单词
适用地方:英文网站中,比如面包屑导航处新闻标题过长.用css截取文本简介时将单词打断 // 使用方法 // 1.复制下面函数 // 2.调用 // 3.填参数 sliceString(targe ...
- SPC空投价值高达310万美金,生态建设者直呼真香!
市场上面有句名言:"人赚不到自己认知以外的财富",这在数字加密上也是共通的.早在本月12日,也就是前天,NGK官方发行的第N波利好---SPC侧链代币空投已经陆续发放了,NGK以及 ...
- Baccarat凭什么吸引做市商?2021年将如何发展?
在过去的一年里,基于资金池的AMM自动化做市商几乎统治了所有DeFi活动,他们没有订单簿,而是根据算法曲线提供资产.尽管在流动性和交易方面取得了令人惊叹的成绩,但是其自身具有无常损失.多代币敞口以及低 ...
- NGK流动性挖矿为何会备受瞩目?
随着越来越多资金的涌入,参与DeFi项目或挖矿的用户不难发现,使用体验不尽人意,在以太坊网络的DeFi时常需要漫长的等待确认和高昂的GAS费用,加上DeFi流动性挖矿需要相对较高的资金门槛和技术门槛, ...