森森最近想让自己的朋友圈熠熠生辉,所以他决定自己写个美化照片的软件,并起名为森森美图。众所周知,在合照中美化自己的面部而不美化合照者的面部是让自己占据朋友圈高点的绝好方法,因此森森美图里当然得有这个功能。 这个功能的第一步是将自己的面部选中。森森首先计算出了一个图像中所有像素点与周围点的相似程度的分数,分数越低表示某个像素点越“像”一个轮廓边缘上的点。 森森认为,任意连续像素点的得分之和越低,表示它们组成的曲线和轮廓边缘的重合程度越高。为了选择出一个完整的面部,森森决定让用户选择面部上的两个像素点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个不大于1000的非负整数,即为像素点的分值。

最后一行给出用户选择的起始和结束像素点的坐标(和(。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

用深搜果然超时了,所以得用广搜了,但并不是每个点都入队列一遍就可以,需要维护一个数组,用来记录从起点(sx,sy)到这个点的最小值,不断更新,如果更新了就入队,否则不入,直到队列为空,
返回终点(ex,ey)的最小值,另外是开头输入起点和终点,给出的是坐标,根数组下标其实是相反的,这个是后来才发现的,判断一个点是否和起点和终点连线共线,可以用向量叉乘积判断,根据右手定则吧应该是。
可以先打表存好,用一个flag与之对应,要bfs两次,找连线的两层吗,通过改变flag的值,判断哪些点是属于正确的一侧。 代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <cmath>
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int,int> pa;
typedef pair<pair<int,int>,double> paa;
const double r = sqrt() - ;
int n,m;
int sx,sy,ex,ey;
double mp[][];
int flag;
int dir[][] = {,,,,,-,-,,-,-,,-,-,,,};
int cc[][];
double rr[] = {,,,,r,r,r,r};
int check(int x,int y) {
int d = (sx - x) * (ey - y) - (ex - x) * (sy - y);
if(d) return d / abs(d);
return ;
}
double bfs() {
bool vis[][] = {false};
double msum[][];
for(int i = ;i < n;i ++) {
for(int j = ;j < m;j ++) {
msum[i][j] = inf;
}
}
msum[sx][sy] = mp[sx][sy];
queue<paa> q;
q.push(paa(pa(sx,sy),mp[sx][sy]));
while(!q.empty()) {
int x = q.front().first.first;
int y = q.front().first.second;
double sum = q.front().second;
q.pop();
for(int i = ;i < ;i ++) {
int tx = x + dir[i][];
int ty = y + dir[i][];
if(tx < || ty < || tx >= n || ty >= m || cc[tx][ty] != flag) continue;
double tsum = sum + mp[tx][ty] + rr[i] * (mp[x][y] + mp[tx][ty]);
if(tsum < msum[tx][ty]) {
q.push(paa(pa(tx,ty),msum[tx][ty] = tsum));
}
}
}
return msum[ex][ey];
}
int main() {
scanf("%d%d",&n,&m);
for(int i = ;i < n;i ++) {
for(int j = ;j < m;j ++) {
scanf("%lf",&mp[i][j]);
}
}
scanf("%d%d%d%d",&sy,&sx,&ey,&ex);
for(int i = ;i < n;i ++) {
for(int j = ;j < m;j ++) {
cc[i][j] = check(i,j);
}
}
double ans = - mp[sx][sy] - mp[ex][ey];
cc[sx][sy] = cc[ex][ey] = flag = ;
ans += bfs();
cc[sx][sy] = cc[ex][ey] = flag = -;
ans += bfs();
printf("%.2f",ans);
}

重温:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <cmath>
#define inf 0x3f3f3f3f
using namespace std;
const double r = sqrt() - ;
int flag;
int n,m,sx,sy,ex,ey;
int dir[][] = {,,,,,-,-,,,,-,-,-,,,-};
double rr[] = {,,,,r,r,r,r};
double mp[][];
double mpm[][];
struct po {
int x,y;
double sum;
po(){}
po(int x,int y,double sum) {
this -> x = x;
this -> y = y;
this -> sum = sum;
}
}temp;
int check(int x,int y) {
if(x == ex && y == ey) return flag;
int d = (sx - x) * (ey - y) - (sy - y) * (ex - x);
if(d) return d / abs(d);
return ;
}
double bfs() {
queue<po> q;
q.push(po(sx,sy,mp[sx][sy]));
mpm[sx][sy] = mp[sx][sy];
mpm[ex][ey] = inf;
while(!q.empty()) {
temp = q.front();
q.pop();
for(int i = ;i < ;i ++) {
int tx = temp.x + dir[i][];
int ty = temp.y + dir[i][];
if(tx < || ty < || tx >= n || ty >= m || check(tx,ty) != flag) continue;
double sum = temp.sum + mp[tx][ty] + rr[i] * (mp[tx][ty] + mp[temp.x][temp.y]);
if(sum < mpm[tx][ty]) {
q.push(po(tx,ty,sum));
mpm[tx][ty] = sum;
}
}
}
return mpm[ex][ey];
}
int main() {
cin>>n>>m;
for(int i = ;i < n;i ++) {
for(int j = ;j < m;j ++) {
cin>>mp[i][j];
mpm[i][j] = inf;
}
}
cin>>sy>>sx>>ey>>ex;
flag = -;
double ans = -mp[sx][sy] - mp[ex][ey] + bfs();
flag = ;
ans += bfs();
printf("%.2f",ans);
}

L3-018 森森美图 (30 分)的更多相关文章

  1. L3-2 森森快递 (30 分)(贪心+线段树/分块)

    题目链接:https://pintia.cn/problem-sets/1108203702759940096/problems/1108204121661857798 题目大意: 森森开了一家快递公 ...

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

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

  3. 【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图【华为云技术分享】

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...

  4. 【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求 ...

  5. 转:【Python3网络爬虫开发实战】6.4-分析Ajax爬取今日头条街拍美图

    [摘要] 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节 ...

  6. 【30分钟学完】canvas动画|游戏基础(extra1-1):美图我也行

    前言 本文是接续系列教程的extra1,主要是介绍颜色系统在canvas中的应用. 本来是与extra1一起成文的,因为segmentfault莫名其妙的字数限制bug只能分割放送了. canvas操 ...

  7. iOS开发系列--打造自己的“美图秀秀”

    --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...

  8. iOS开发系列--打造自己的“美图秀秀”

    概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Co ...

  9. 美图美妆由Try Try接手运营

    美图又把一个拖累营收的业务转让出去了. 美图的电商业务——美图美妆应用在向用户发布终止运营的公告后,宣布把业务交给了寺库旗下公司 Try Try 运营.Try Try 接手了美图美妆的所有管理运营权, ...

随机推荐

  1. NGUI中 鼠标划出屏幕后,停止对 UIDragScrollView 的 press

    using UnityEngine; /// <summary> /// NGUI中 鼠标划出屏幕后,停止对 UIDragScrollView 的 press /// </summa ...

  2. Java线程池队列吃的太饱,撑着了咋整?java 队列过大导致内存溢出

    Java的Executors框架提供的定长线程池内部默认使用LinkedBlockingQueue作为任务的容器,这个队列是没有限定大小的,可以无限向里面submit任务. 当线程池处理的太慢的时候, ...

  3. 新概念 Lesson 5 How are you today

    How is Emma? 艾玛身体还好吗? 短语:very well How's Emma? She's very well, too. Emma is very well today   adv. ...

  4. Cron\CronExpression::setPart("24")

    利用laravle实现定时器的功能的时候,报错说:Cron\CronExpression::setPart("24"). 后来发现是时间设置的问题,他不能设置("24:0 ...

  5. hdu3374 kmp+最小表示法

    Give you a string with length N, you can generate N strings by left shifts. For example let consider ...

  6. python-day49--前端 css-层叠样式表

    1.css功能: 对html标签的渲染和布局 2.CSS 要掌握的两方面: 1.查找标签 选择器 2.操作标签  (对属性进行操作) 3.CSS 语法 CSS 规则由两个主要的部分构成:选择器,以及一 ...

  7. python-day47--mysql数据备份与恢复

    一.IDE工具介绍 掌握: #1. 测试+链接数据库 #2. 新建库 #3. 新建表,新增字段+类型+约束 #4. 设计表:外键 #5. 新建查询 #6. 备份库/表 #注意: 批量加注释:ctrl+ ...

  8. hdu2110(多重背包/母函数)

    http://acm.hdu.edu.cn/showproblem.php?pid=2110 就是个多重背包,有坑点-.-.注意答案模10000中间结果有可能会爆所以计算时就要取模: 由于必须能均分三 ...

  9. dp练习(0)——数字三角形

    3298: 数字三角形 时间限制: 1 Sec  内存限制: 128 MB提交: 114  解决: 29[提交][状态][讨论版] 题目描述 如图示出了一个数字三角形. 请编一个程序计算从顶至底的某处 ...

  10. SQL Server 调优系列基础篇 - 索引运算总结

    前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方 ...