problem

L3-018 森森美图 (30分)
森森最近想让自己的朋友圈熠熠生辉,所以他决定自己写个美化照片的软件,并起名为森森美图。众所周知,在合照中美化自己的面部而不美化合照者的面部是让自己占据朋友圈高点的绝好方法,因此森森美图里当然得有这个功能。 这个功能的第一步是将自己的面部选中。森森首先计算出了一个图像中所有像素点与周围点的相似程度的分数,分数越低表示某个像素点越“像”一个轮廓边缘上的点。 森森认为,任意连续像素点的得分之和越低,表示它们组成的曲线和轮廓边缘的重合程度越高。为了选择出一个完整的面部,森森决定让用户选择面部上的两个像素点A和B,则连接这两个点的直线就将图像分为两部分,然后在这两部分中分别寻找一条从A到B且与轮廓重合程度最高的曲线,就可以拼出用户的面部了。 然而森森计算出来得分矩阵后,突然发现自己不知道怎么找到这两条曲线了,你能帮森森当上朋友圈的小王子吗?

为了解题方便,我们做出以下补充说明:

图像的左上角是坐标原点(0,0),我们假设所有像素按矩阵格式排列,其坐标均为非负整数(即横轴向右为正,纵轴向下为正)。
忽略正好位于连接A和B的直线(注意不是线段)上的像素点,即不认为这部分像素点在任何一个划分部分上,因此曲线也不能经过这部分像素点。
曲线是八连通的(即任一像素点可与其周围的8个像素连通),但为了计算准确,某像素连接对角相邻的斜向像素时,得分额外增加两个像素分数和的√
​2

​​ 倍减一。例如样例中,经过坐标为(3,1)和(4,2)的两个像素点的曲线,其得分应该是这两个像素点的分数和(2+2),再加上额外的(2+2)乘以(√
​2

​​ −1),即约为5.66。
输入格式:
输入在第一行给出两个正整数N和M(5≤N,M≤100),表示像素得分矩阵的行数和列数。

接下来N行,每行M个不大于1000的非负整数,即为像素点的分值。

最后一行给出用户选择的起始和结束像素点的坐标(X
​start
​​ ,Y
​start
​​ )和(X
​end
​​ ,Y
​end
​​ )。4个整数用空格分隔。

输出格式:
在一行中输出划分图片后找到的轮廓曲线的得分和,保留小数点后两位。注意起点和终点的得分不要重复计算。

输入样例:
6 6
9 0 1 9 9 9
9 9 1 2 2 9
9 9 2 0 2 9
9 9 1 1 2 9
9 9 3 3 1 1
9 9 9 9 9 9
2 1 5 4
输出样例:
27.04

  • 给出一个n*m的矩阵,每个点有点权
  • 求两条分散在起点s到终点t连线两边的最短点权路(可以用斜边),输出权值和

solution

  • 将矩形分成ab两边分别求最短路,转移的时候用三点共线判断是否越界即可。
  • 矩形上求最短路可以直接bfs,当然dijkstra或者spfa也区别不大。
#include<bits/stdc++.h>
using namespace std;
const int inf = 1e9+10;
const int maxn = 110;struct point{ int x, y;  double dis;};
bool operator!=(point a, point b){return a.x!=b.x||a.y!=b.y;}
bool operator==(point a, point b){return a.x==b.x&&a.y==b.y;}int n, m;
double sc[maxn][maxn];//分数
point s, t;
void input(){cin>>n>>m;for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)cin>>sc[i][j];cin>>s.y>>s.x>>t.y>>t.x;s.x++;s.y++;t.x++;t.y++;s.dis = sc[s.x][s.y];
}int flag;//1上半部分,0下半部分
double f[maxn][maxn]; //到i,j为止的最小值
int dir[][2]= {{0,1},{1,0},{-1,0},{0,-1},{-1,-1},{1,-1},{-1,1},{1,1}}; //上下左右+前后左右
int cross(point a,point b,point p){//三角形行列式公式,判断三点是否在一个直线上return (b.x-a.x)*(p.y-a.y)-(p.x-a.x)*(b.y-a.y);
}
bool check(point p){//检查p是否合法(越界)if(p.x<1||p.x>n||p.y<1||p.y>m)return false;//越界if(flag && p!=s&&p!=t && cross(s,t,p)<=0)return false;//1:上半部分但点在下面(起点终点不算)if(!flag && p!=s&&p!=t && cross(s,t,p)>=0)return false;//2.下半部分但点在上面if(p.dis>=f[p.x][p.y])return false;//不是最小值return true;
}
void bfs(){//initqueue<point>q;for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)f[i][j] = inf;//searchif(check(s)){f[s.x][s.y] = s.dis;q.push(s);}while(q.size()){point now = q.front(); q.pop();point next;for(int i = 0; i < 8; i++){next.x=now.x+dir[i][0];next.y=now.y+dir[i][1];if(i<4)next.dis = f[now.x][now.y]+sc[next.x][next.y];else next.dis=f[now.x][now.y]+sc[next.x][next.y]+(sc[next.x][next.y]+sc[now.x][now.y])*(sqrt(2)-1);if(check(next)){f[next.x][next.y] = next.dis;q.push(next);}}}
}int main(){input();double ans = 0;flag = 1; bfs(); ans += f[t.x][t.y];//搜上面flag = 0; bfs(); ans += f[t.x][t.y];//搜下面ans -= sc[s.x][s.y]+sc[t.x][t.y];//重复printf("%.2f\n",ans);return 0;
}

【CCCC】L3-018 森森美图 (30分),计算几何+判断三点共线+bfs最短路相关推荐

  1. 【CCCC】L3-021 神坛 (30分)计算几何+求三角形面积(极角排序)

    problem L3-021 神坛 (30分) 在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如 ...

  2. 【CCCC】L3-012 水果忍者 (30分),,枚举斜率

    problem L3-012 水果忍者 (30分) 2010年风靡全球的"水果忍者"游戏,想必大家肯定都玩过吧?(没玩过也没关系啦~)在游戏当中,画面里会随机地弹射出一系列的水果与 ...

  3. 【CCCC】L3-003 社交集群 (30分),并查集模板,map排序

    problem L3-003 社交集群 (30分) 当你在社交网络平台注册时,一般总是被要求填写你的个人兴趣爱好,以便找到具有相同兴趣爱好的潜在的朋友.一个"社交集群"是指部分兴趣 ...

  4. PAT甲级1076 Forwards on Weibo (30 分) :[C++题解]图论、bfs

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: BFS如何搜前k层?统计前k层的点数. ac代码 #include<bits/stdc++.h> using names ...

  5. PAT甲级1072 Gas Station (30 分):[C++题解]dijkstra算法、最短路

    文章目录 题目分析 题目来源 题目分析 来源:acwing 分析: 所有的dist[ ]都≤Ds:最小的dist[ ]最大; dist[ ] 总和最大. 由于加油站是字符,为了简单起见,将m个加油站编 ...

  6. L3-017 森森快递 (30 分)

    森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(编号.由于道路限制,第i号城市(,)与第(号城市中间往返的运输货物重 ...

  7. L3-021 神坛 (30 分) 计算几何

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  8. 【CCCC】L3-022 地铁一日游 (30分),floyd+大模拟

    problem L3-022 地铁一日游 (30分) 森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的 ...

  9. 团体天梯 L3-022 地铁一日游 (30 分)(测试点分析 and 推荐测试样例)

    L3-022 地铁一日游 (30 分) 森森喜欢坐地铁.这个假期,他终于来到了传说中的地铁之城--魔都,打算好好过一把坐地铁的瘾! 魔都地铁的计价规则是:起步价 2 元,出发站与到达站的最短距离(即计 ...

最新文章

  1. python 100题
  2. WampServer修改端口及菜单Localhost
  3. docker集群管理
  4. Pycharm中无法导入各种Python模块,pip不能更新的解决办法
  5. html中如何显示纯文本,从Html中取出纯文本
  6. 手动搭建latex公式渲染服务器
  7. oracle数据库修改连接数
  8. Okhttp3 使用和原理(DEMO)
  9. pg数据库中postgis的使用
  10. 盒子科技刘恒:聚合支付系统演讲
  11. iOS-常用的第三方库以及实例
  12. 江苏省计算机二级c语言备考,江苏省计算机二级C语言考试备考指南
  13. 关于网络、交换机、路由器
  14. 条码打印软件及条码打印机中如何设置纸张大小
  15. 数据库应用程序开发基础篇—— .NET中SQL Server数据库的操作C#篇之一
  16. 截至2018年,全球主要城市地铁里程分别为(单位:千米):上海:673,北京:608,莫斯科:437,伦敦:402,纽约:38等绘制如下图所示的全球主要城市地铁里程示意图。
  17. python广义极值_广义极值分布的数据拟合
  18. 探秘国内地下数据交易市场
  19. 系统主数据管理之物料(Item)五 Item 的制造商部件号(MPN)
  20. SAP-CDS+Odata+BOPF 创建与使用介绍,fiori一体化测试

热门文章

  1. 机器学习/深度学习测试题(二)—— 单层线性神经网络求解异或问题
  2. Frequentist 观点和 Bayesian 观点
  3. GPS 的物理数学原理
  4. 【学习 Opencv】—— 常见接口
  5. virtualenv 指定 python 解释器的版本
  6. 逻辑思维与C/C++解题
  7. 卷积及卷积的性质与应用
  8. C++基础——用C++实例理解UML类图
  9. python爬虫教程-Python爬虫入门教程——爬取自己的博客园博客
  10. 国外大神一张图学会python-没有接触过编程Python难学吗?