天鹅会面题解

题目描述

两头白天鹅生活在一个部分湖面结了冰的湖泊中,湖面的形状为一个长方形,并且被分割成R行C列的小方格,某些方格中结了冰,这样的方格称之为冰格,其余的方格称之为水格。冬天过去了,湖面上的冰渐渐开始溶解了,每一天与水相邻的冰格就将消融而转化为水格。所谓两个方格相邻是指它们在水平或垂直方向有公共边,两个呈对角的方格是不相邻的,下图给出样例数据的演化过程。

白天鹅只能在水中沿水平或垂直方向游动,写一个程序判断多少天后两只白天鹅才能够相会。

【输入格式】

输入文件第一行包含两个用空格隔开的整数R和C,其中1 ≤ R, C ≤ 1500,接下来的R行每行包含C个字符,描述湖面的初始状态,‘·’表示水格,‘ X’表示冰格,‘ L’表示一只白天鹅。

【输出格式】

输出文件仅一行包含一个整数表示两只白天鹅等到相邻那一天所需的天数。

【输入样例】

8 17

...XXXXXX..XX.XXX

....XXXXXXXXX.XXX

...XXXXXXXXXXXX..

..XXXXX.LXXXXXX..

.XXXXXX..XXXXXX..

XXXXXXX...XXXX...

..XXXXX...XXX....

....XXXXX.XXXL...

【输出样例】

2

Hint

30%数据1 ≤ R《400.1 ≤ C《300

100%其中1 ≤ R, C ≤ 1500

solution:

  这题没别的一看肯定是搜索,先一遍bfs处理出来每一个点最少需要几点化成水(本来是水的为0天),然后在一遍bfs跑到达这点的最优路径中的最大天数,这里需要注意的是一个点会在好几条路径上,所以有可能进队出对好几次不能用vis数组判断被访问或就不在访问,这样得到的路径只是其中最先访问的一条,但不一定是上最优的,再跑一遍bfs就可以啦。

     考试的时候脑残把第二个bfs换成了dfs结果呵呵了。。。。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 using namespace std;
  6 #define N 1505
  7 int r,c,blo;
  8 char read() {
  9     char ch=getchar();
 10     while(ch!=‘X‘&&ch!=‘.‘&&ch!=‘L‘) {
 11         ch=getchar();
 12     }
 13     return ch;
 14 }
 15 char s[N][N];
 16 int ji1x,ji1y,ji2x,ji2y,head,tail;
 17 int step[N][N];
 18 struct node {
 19     int x,y;
 20 } queue[20000005];
 21 void bfs() {
 22     while(head<tail) {
 23         int x=queue[++head].x,y=queue[head].y;
 24         if(step[x+1][y]>step[x][y]+1&&x<r) {
 25             step[x+1][y]=step[x][y]+1;
 26             queue[++tail].x=x+1;
 27             queue[tail].y=y;
 28         }
 29         if(step[x-1][y]>step[x][y]+1&&x>1) {
 30             step[x-1][y]=step[x][y]+1;
 31             queue[++tail].x=x-1;
 32             queue[tail].y=y;
 33         }
 34         if(step[x][y+1]>step[x][y]+1&&y<c) {
 35             step[x][y+1]=step[x][y]+1;
 36             queue[++tail].x=x;
 37             queue[tail].y=y+1;
 38         }
 39         if(step[x][y-1]>step[x][y]+1&&y>1) {
 40             step[x][y-1]=step[x][y]+1;
 41             queue[++tail].x=x;
 42             queue[tail].y=y-1;
 43         }
 44     }
 45 }
 46 bool in[N][N];
 47 int ans=0x7fffffff;
 48 int ji[N][N];
 49 void bfs2() {
 50     memset(queue,0,sizeof(queue));
 51     memset(ji,0x5f,sizeof(ji));
 52     head=tail=0;
 53     queue[++tail].x=ji1x;
 54     queue[tail].y=ji1y;
 55     in[ji1x][ji1y]=1;
 56     ji[ji1x][ji1y]=0;
 57     while(head<tail) {
 58         int x=queue[++head].x,y=queue[head].y;
 59         in[x][y]=0;
 60         if(x==ji2x&&y==ji2y) {
 61             ans=min(ans,ji[x][y]);
 62             continue;
 63         }
 64         if(max(step[x+1][y],ji[x][y])<ji[x+1][y]&&x<r) {
 65             ji[x+1][y]=max(step[x+1][y],ji[x][y]);
 66             if(!in[x+1][y]) {
 67                 in[x+1][y]=1;
 68                 queue[++tail].x=x+1;
 69                 queue[tail].y=y;
 70             }
 71         }
 72         if(max(step[x-1][y],ji[x][y])<ji[x-1][y]&&x>1) {
 73             ji[x-1][y]=max(step[x-1][y],ji[x][y]);
 74             if(!in[x-1][y]) {
 75                 in[x-1][y]=1;
 76                 queue[++tail].x=x-1;
 77                 queue[tail].y=y;
 78             }
 79         }
 80         if(max(step[x][y+1],ji[x][y])<ji[x][y+1]&&y<c) {
 81             ji[x][y+1]=max(step[x][y+1],ji[x][y]);
 82             if(!in[x][y+1]) {
 83                 in[x][y+1]=1;
 84                 queue[++tail].x=x;
 85                 queue[tail].y=y+1;
 86             }
 87         }
 88         if(max(step[x][y-1],ji[x][y])<ji[x][y-1]&&y>1) {
 89             ji[x][y-1]=max(step[x][y-1],ji[x][y]);
 90             if(!in[x][y-1]) {
 91                 in[x][y-1]=1;
 92                 queue[++tail].x=x;
 93                 queue[tail].y=y-1;
 94             }
 95         }
 96     }
 97 }
 98 int main() {
 99     freopen("swan.in","r",stdin);
100     freopen("sdsd.out","w",stdout);
101     memset(step,0x5f,sizeof(step));
102     scanf("%d%d",&r,&c);
103     head=tail=0;
104     for(int i=1; i<=r; i++) {
105         for(int j=1; j<=c; j++) {
106             s[i][j]=read();
107             if(s[i][j]==‘L‘) {
108                 if(!ji1x) {
109                     ji1x=i;
110                     ji1y=j;
111                 } else {
112                     ji2x=i;
113                     ji2y=j;
114                 }
115             }
116             if(s[i][j]==‘L‘||s[i][j]==‘.‘) {
117                 queue[++tail].x=i;
118                 queue[tail].y=j;
119                 step[i][j]=0;
120             }
121         }
122     }
123     bfs();
124     bfs2();
125     cout<<ans;
126     return 0;
127 }
时间: 2024-10-05 19:56:04

天鹅会面题解的相关文章

天鹅会面

[题目描述] 两头白天鹅生活在一个部分湖面结了冰的湖泊中,湖面的形状为一个长方形,并且被分割成R行C列的小方格,某些方格中结了冰,这样的方格称之为冰格,其余的方格称之为水格.冬天过去了,湖面上的冰渐渐开始溶解了,每一天与水相邻的冰格就将消融而转化为水格.所谓两个方格相邻是指它们在水平或垂直方向有公共边,两个呈对角的方格是不相邻的,下图给出样例数据的演化过程. 白天鹅只能在水中沿水平或垂直方向游动,写一个程序判断多少天后两只白天鹅才能够相会. [输入格式] 输入文件第一行包含两个用空格隔开的整数R

8.11联考题解

样例输入: 3 6 0 -1 1 1 0 -1 -1 1 0 1 2 3 1 2 3 样例输出: 3 题解      不要看上面那个吓人的时间限制--实际上内网给了4Sec,高明的模拟能过:外网给的时间比这还多,直接暴力模拟就能A,这就是为什么我今天成绩莫名高了不少.刚开始就只想到了模拟,用链表可以稍微优化一点有限,然而时间效率近似于n*答案,要依靠答案的大小来决定时间效率,让我不由得想到某名为<天鹅会面>的惨痛事故.想了很久还是没想出来,直接把模拟当做骗分程序来写,连快读都没有写:自认为是今

2017/8/6 考试吐槽

2016 8 6 成绩:20 (既然翻车了就多扯几句,反正也不怕什么,都是自己人) 得知成绩的一刻瘫倒在了地上--满怀希望的一场考试竟是这样的一场大翻车--只能用惨烈形容了--我菜爆了--一天天依赖STL都有毒啊--我说啥啊--能说的全卡在嗓子眼出不来啊--我真--菜的抠脚!唉--全都考好了,自己弱也怪不得出题人--算了先到这里,先开始口胡 A.天鹅会面 首先贴出一个英吹四艇的OJ上的链接:http://codeup.hustoj.com/problem.php?id=25481&csrf=5d

有一种恐怖,叫大爆搜

到目前这个阶段,大爆搜做了好几个,有必要做一下小的总结了. 玛雅游戏:出门左转 http://www.cnblogs.com/Loser-of-Life/p/7247413.html的A 斗地主:出门右转http://www.cnblogs.com/Loser-of-Life/p/7259858.html的B 天鹅会面:出门直行http://www.cnblogs.com/Loser-of-Life/p/7295770.html的A 引水入城:链接:http://cogs.pro/cogs/pr

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种

8.8联考题解

今天的T1让我怀疑我是不是在做奥赛题--这考的是什么知识点啊这个,会不会用绝对值函数? Evensgn 的债务 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Evensgn 有一群好朋友,他们经常互相借钱.假如说有三个好朋友A,B,C.A 欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元.Evensgn 是个追求简约的人,他觉得这样的债务太繁杂了.他认为,上面的债务可以完全等价为 A 欠C20 元,B 既不欠别人,别人也不欠他.这样总债务规模就压缩到了 

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

(leetcode题解)Pascal&#39;s Triangle

Pascal's Triangle  Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 题意实现一个杨辉三角. 这道题只要注意了边界条件应该很好实现出来,C++实现如下 vector<vector<int>> generate(int

2017ZZUACM省赛选拔试题部分题解----谨以纪念我这卡线滚粗的美好经历

写在前面: 其实心里有些小小的不爽又有点小小的舒畅,为啥捏?不爽当然是因为没被选拔上啦,舒畅捏则是因为没被选拔上反而让自己警醒,学长也提点很多很多."沉下去,然后一战成名"学长如是对我说,我很开心.其实这完全算不算是题解,只是我个人的一些小想法而已.而且到现在还有一题不会...让自己长点记性吧. 题目 A :聪明的田鼠 Time Limit: 1 Sec Memory Limit: 128 MB Description 田鼠MIUMIU来到了一片农田,农田可以看成是一个M*N个方格的矩