洛谷题目链接:奶牛美容



## 题目描述

输入输出格式

输入格式:

输出格式:

输入输出样例

输入样例#1:

6 16

................

..XXXX....XXX...

...XXXX....XX...

.XXXX......XXX..

........XXXXX...

..XXX....XXX....

输出样例#1:

4

简述一下题意:给出一个矩阵,矩阵上有三个点(??),要求出最少改变几个点才能使这三个点变成一个点.




显然我们可以求出每两个点的距离,答案就是另外两个点到这个点的距离之和.




然而这样是有问题的,比如这样:

...X.....X...
.............
......X......

这样这些点并不需要到连同一个点,所以在之前答案的基础上再枚举一遍三个点到同一个位置的距离之和能不能更新答案就好了.




步骤:

  1. 广搜求出每个位置所属的点.
  2. 深搜求出一个点到每个位置的最短长度.
  3. 对到同一点和三点再外面连通的情况取最小值.
  4. 最后答案要-2(因为在计算距离时是算的连入到一个点的长度,所以连进去的那个格子不要算).


#include<bits/stdc++.h>
using namespace std;
const int N=500+5;
const int inf=2147483647; int n, m, cnt = 0, ans = inf;
char a[N][N];
int col[N][N];
int mn[N][N];
int d[4][N][N];
int mv[]={1,0,-1,0,1}; struct node{
int x, y;
}; bool ok(node nt){
if(nt.x < 1 || nt.x > n) return false;
if(nt.y < 1 || nt.y > m) return false;
if(col[nt.x][nt.y] || a[nt.x][nt.y] != 'X') return false;
return true;
} void bfs(int x,int y){
cnt++; queue <node> q;
q.push((node){x,y}); col[x][y] = cnt;
node now, nt;
while(!q.empty()){
now = q.front(); q.pop();
for(int i=0;i<4;i++){
nt.x = now.x+mv[i]; nt.y = now.y+mv[i+1];
if(ok(nt)) col[nt.x][nt.y] = cnt, q.push(nt);
}
}
} void dfs(int color,int x,int y,int step){
if(d[color][x][y] <= step) return;
d[color][x][y] = step;
int nx, ny;
for(int i=0;i<4;i++){
nx = x+mv[i], ny = y+mv[i+1];
if(nx>=1 && nx<=n && ny>=1 && ny<=m)
dfs(color,nx,ny,step+1);
}
} int main(){
//freopen("war.in","r",stdin);
//freopen("war.out","w",stdout);
char ch; cin >> n >> m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin >> a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!col[i][j] && a[i][j] == 'X') bfs(i,j);
memset(d,127/3,sizeof(d));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j] == 'X') dfs(col[i][j],i,j,0);
memset(mn,127/3,sizeof(mn));
for(int c=1;c<=3;c++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
mn[col[i][j]][c] = mn[c][col[i][j]] = min(mn[c][col[i][j]],d[c][i][j]);
ans = min(mn[1][2]+mn[2][3],min(mn[1][3]+mn[3][2],mn[3][1]+mn[1][2]));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
ans = min(ans,d[1][i][j]+d[2][i][j]+d[3][i][j]);
printf("%d\n",ans-2);
return 0;
}

[洛谷P2124] 奶牛美容的更多相关文章

  1. 洛谷2344 奶牛抗议(DP+BIT+离散化)

    洛谷2344 奶牛抗议 本题地址:http://www.luogu.org/problem/show?pid=2344 题目背景 Generic Cow Protests, 2011 Feb 题目描述 ...

  2. 洛谷P2402 奶牛隐藏

    洛谷P2402 奶牛隐藏 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛混乱的原因看题目描述) 题目描述 在一个农场里有n块田地. ...

  3. 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)

    洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...

  4. [洛谷P1842] 奶牛玩杂技

    题目类型:贪心+证明,经典题 传送门:>Here< 题意:有\(N\)头奶牛,每个奶牛有一个重量\(W[i]\),力量\(S[i]\).定义每个奶牛的压扁程度为排在它前面的所有奶牛的总量之 ...

  5. [WC2002][洛谷P1578]奶牛浴场

    洛谷题解里那个人可真是话多呢. 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每 ...

  6. 洛谷 P1578 奶牛浴场

    https://www.luogu.org/problemnew/show/P1578 题解 另外这题有一些小坑,洛谷的题解里面有讲 #pragma GCC optimize("Ofast& ...

  7. [洛谷p2858] 奶牛零食

    题目链接: 点我 题目分析: 这是什么,区间dp吗?怎么大佬都在说区间dp的样子 完蛋区间dp都不知道是啥quq 于是使用了玄学的姿势A过了这道题 设dp[i][j][0]表示第i天,左边选了j个,当 ...

  8. 洛谷 P1843 奶牛晒衣服

    题目背景 熊大妈决定给每个牛宝宝都穿上可爱的婴儿装 . 于是 , 为牛宝宝洗晒衣服就成了很不爽的事情. 题目描述 熊大妈请你帮助完成这个重任 . 洗完衣服后 , 你就要弄干衣服 . 衣服在自然条件下用 ...

  9. 洛谷P1154 奶牛分厩

    P1154 奶牛分厩 173通过 481提交 题目提供者该用户不存在 标签高性能 难度普及- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 测试点3??? 求助!超时了 我抗议 ...

随机推荐

  1. Django调试models输出的SQL语句

    django1.3在shell下,调试models变得更为简单了,不用像之前的版本,手工去调用django query,才能打印出之前的代码是执行的什么SQL语句. 1.3开始只需在settings. ...

  2. OSI七层模型加协议

    OSI七层网络模型 TCP/IP四层概念模型 对应网络协议 应用层(Application) 应用层 HTTP.TFTP, FTP, NFS, WAIS.SMTP 表示层(Presentation) ...

  3. 【C#】 URL Protocol

    [C#] URL Protocol 网页调用本地程序, 支持 Windows 下所有浏览器, 与浏览器插件对比实现简单,但判断是否调用成功时, 只有ie10以上有函数,其他浏览器得自己实现(用 ifr ...

  4. What to do when Enterprise Manager is not able to connect to the database instance (ORA-28001)

    摘自:http://dbtricks.com/?p=34 If you are trying to connect to the Oracle enterprise Manger and you ge ...

  5. java 日期格式 毫秒 表示方法

    参考URL:http://www.busfly.net/csdn/post/java_string_fomat_date_time_simpledateformat.html 关键代码: java.t ...

  6. 『JavaScript』核心

    弱类型语言 JavaScript是一种弱类型的语言.变量可以根据所赋的值改变类型.原始类型之间也可以进行类型转换.其弱类型的物质为其带来了极大的灵活性. 注意:原始类型使用值传递,复合类型使用引用传递 ...

  7. JAVA虚拟机(一):内存区域

    根据<java虚拟机规范第二版>规定,现阶段的java内存区域总体如下图 其中,方法区和堆是所有线程共享区域. 虚拟机栈,本地方法栈,程序计数器是各线程独占. 概述一下各个区域 先说说线程 ...

  8. KVM WEB管理工具——WebVirtMgr(二)日常配置

    配置宿主机 1.登录WebVirtMgr管理平台 2.添加宿主机 选择首页的WebVirtMgr -->Addd Connection 选择“SSH链接“,设置Label,IP,用户 注意:La ...

  9. zabbix 语音告警

    之前的文章中已经实现了zabbix 邮件告警和微信告警,生产环境上测试出消息抵达很及时,但是!万一服务器在大半夜突发故障微信.邮件这些通知都是废物了,大晚上还能听到微信通知吗?显然不可能(我的某朋友就 ...

  10. 为 Ubuntu/Anaconda/pip 添加国内下载源

    背景 正在看 tensorflow-lite 压缩模型的部分,结果 tutorial 一上来就要卸旧版安装 tf-nightly (新版?反正小白下就vans了) 然而好不容易才编译好源码舍不得删.又 ...