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个不大于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(2) - 1;
int n,m;
int sx,sy,ex,ey;
double mp[101][101];
int flag;
int dir[8][2] = {0,1,1,0,0,-1,-1,0,-1,-1,1,-1,-1,1,1,1};
int cc[101][101];
double rr[8] = {0,0,0,0,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 0;
}
double bfs() {
    bool vis[101][101] = {false};
    double msum[101][101];
    for(int i = 0;i < n;i ++) {
        for(int j = 0;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 = 0;i < 8;i ++) {
            int tx = x + dir[i][0];
            int ty = y + dir[i][1];
            if(tx < 0 || ty < 0 || 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 = 0;i < n;i ++) {
        for(int j = 0;j < m;j ++) {
            scanf("%lf",&mp[i][j]);
        }
    }
    scanf("%d%d%d%d",&sy,&sx,&ey,&ex);
    for(int i = 0;i < n;i ++) {
        for(int j = 0;j < m;j ++) {
            cc[i][j] = check(i,j);
        }
    }
    double ans = 0 - mp[sx][sy] - mp[ex][ey];
    cc[sx][sy] = cc[ex][ey] = flag = 1;
    ans += bfs();
    cc[sx][sy] = cc[ex][ey] = flag = -1;
    ans += bfs();
    printf("%.2f",ans);
}

原文地址:https://www.cnblogs.com/8023spz/p/10483962.html

时间: 2024-11-13 09:03:02

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

芝麻HTTP:分析Ajax爬取今日头条街拍美图

本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节开始之前,请确保已经安装好requests库. 2.实战演练 首先,实现方法get_page()来加载单个Ajax请求的结果.其中唯一变化的参数就是offset,所以我们将它当作参数传递,实现如下: import requests from urllib.parse import urlencode def

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

前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 准备工作在本节开始之前,请确保已经安装好requests库.如果没有安装,可以参考第1章.另外如果你对python的库不是很熟的话,建议先去小编的Python交流.裙 :一久武其而而流

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

前言 本文是接续系列教程的extra1,主要是介绍颜色系统在canvas中的应用. 本来是与extra1一起成文的,因为segmentfault莫名其妙的字数限制bug只能分割放送了. canvas操纵像素 你如果认为canvas只是画图工具,那接下来的操作会颠覆你的认知.canvas提供api可以获取画布上任何一个像素,并可以自由的操作他们. 获取像素 直接访问像素的功能由canvas上下文中的ImageData对象提供,它提供了以下一组方法,都会返回ImageData对象. getImage

美图45亿美元估值赴港上市仅次腾讯,成10年来最大科技公司上市交易

作者:楠沨 [IT战略家] 根据汤森路透 IFR 的消息,美图公司目前暂定的发行价区间为每股 8.50 至 9.60 港元,折合 1.10 至 1.24 美元,最终定价将在 12 月 8 日公布. IPO总额为 7.35 亿美元,估值 45 亿美金.这将是今年仅次于Line的全球第二大技术类IPO,美图也将成为港股中仅次于腾讯的第二大互联网公司. 消息传出后,美图因招股书显示出来其大额亏损及变现模式不清晰引起争议.当前媒体兵分两路,一路直言其盈利模式单一并不看好,一路认为其可观的用户数据基础上,

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

http://www.cnblogs.com/kenshincui/p/3959951.html#overview --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 基本图形绘制 视图刷新 其他图形上下文 Core Image Quartz 2D 在iOS中常用的绘图框

美图亏损上市背后:未来国内市场放缓 拓展新增量面临挑战

坐拥数亿流量,但仍面临“亏损上市”的质疑,蔡文胜给出一个时间表,2017财年美图将开展商业化,并于年底实现互联网增值服务及其他分部的盈亏平衡.12月15日,9点30分的香港交易所人头攒动,美图公司正式敲锣宣布成功上市,公司以接近招股区间低端的每股8.78港元价格发行股份,市值达371亿港元(47亿美元). 与传统公司上市大家习惯用掌声欢庆的不同,上市现场美图公司的嘉宾们更喜欢通过直播传达现场气氛.在等待敲锣的间隙,吴欣鸿.蔡文胜.李开复以及其他参与这场资本盛宴的投资者都满面喜色的通过手机摄像头跟

打造自己的“美图秀秀”

概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 在iOS中常用的绘图框架就是Quartz 2D,Quartz 2D是Core Graphics框架的一部分,是一个强大的二维图像绘制引擎.Quartz 2D在UIKit中也有很好的封装和集成,我们日常开发时所用到的UIKit中的组件都是由Cor

美图故事,一个男人美的疯狂

一个八零后男人创造了一系列关于美的故事,让男人讨厌,让女人爱不释手. 美图公司刚在第十届金鹰节互联盛典中荣获年度公司奖,这家创建于2008年10月的公司开发了一系列与美有关的产品,有相当火热的美颜相机.美图秀秀.美拍,还有海报工厂.柚子相机.美图看看.表情工厂.美图贴贴.美陌等产品,而这一切都和美图秀秀创始人吴欣鸿分不开. 现在中国互联网.科技圈的成功公司创始人都有些草莽英雄的味道,他们也许没有令人眩晕的学历背景.彪悍的家世,但都在自己起起伏伏的人生里不怕失败,经得起起落,吴欣鸿应该也能算是其中

美图美妆由Try Try接手运营

美图又把一个拖累营收的业务转让出去了.美图的电商业务--美图美妆应用在向用户发布终止运营的公告后,宣布把业务交给了寺库旗下公司 Try Try 运营.Try Try 接手了美图美妆的所有管理运营权,包括品牌推广.商品采购.销售.发货.客服等,美图则会继续用旗下的产品为美图美妆导流,并可以获得保底收益和分成收益.除了运营美图美妆业务,寺库创始人兼 CEO 李日学还说会把美图的 AI 测肤功能融入寺库的业务.寺库是一家主营奢侈品电商业务的公司,于 2017 年 9 月在美国纳斯达克上市,截止 201