Jelly的难题【题目链接】

废话一句:今天中考出成绩,感觉大家考的都超级棒,不管怎样,愿大家成为最好的自己。

好了废话完了,下面是题解部分:


SOLUTION:

首先你可能发生的,是看不懂题:

定睛一看,这是个广搜!(然后非常幸运昨天刚做了一个广搜的题,然后我就会了)

首先先是输入部分,这个真的很毒瘤了,当sy已经去忙akT1的时候,我还在可怜的与读入作斗争(与读入抗争掉了大部分时间可还行)。读入很毒瘤,因为每个字符之间有空格,所以读入的时候要用while过滤。然后咱的读入好生毒瘤,看看就好啦(相信像ych这样的大佬肯定有更优的方法):

  1. n=read();m=read();
  2. char ch=getchar();
  3. for(int i=;i<=n;i++){
  4. for(int j=;j<=m;j++){
  5. while(ch==' '||ch=='\n'||ch=='\r') ch=getchar();
  6. a1[i][j]=ch;
  7. if(a1[i][j]=='*') x=i,y=j,a[i][j]=;
  8. if(a1[i][j]=='#') a[i][j]=;
  9. if(a1[i][j]=='o') a[i][j]=;
  10. ch=getchar();
  11. }
  12. }

然后就是bfs部分了,其实就是一个标准的广搜板子,然后因为最近看了tarjan,我居然在bfs里用了时间戳可海星。

首先要说一直理解不了构造函数这种东西,所以一直都是写赋值函数,看看就好。

首先显然是把*(也就是打印机)的地方加进队列中,然后别忘记开vis记录已经走过了。

然后while(!q.empty()),每次取出队首,向四个方向扩展(当然前提是可以扩展因此记得写pan函数),然后对于最大时间以及卷子数量,我用了时间的理念,也就是记录访问顺序(当然并不是完全时间戳),进行储存与bfs,每次取出队首,然后四个方向尝试拓展,如果可以拓展,那么拓展,将其入队,并将新入队的结点的dfn值在被拓展出的结点的基础上+1,这样最大的dfn也就是最大的时间ans。然后还有如何算总共的卷子数,我的算法比较复杂,感觉过于麻烦了(看看就好啦),记录每个时间戳,然后用ans-时间戳+1,表示的就是这个结点的卷子数。然后加起来就好啦。

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. inline int read(){
  6. int ans=;
  7. char last,ch=getchar();
  8. while(ch<''||ch>'') last=ch,ch=getchar();
  9. while(ch>=''&&ch<='') ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
  10. if(last=='-') ans=-ans;
  11. return ans;
  12. }
  13.  
  14. int n,m,x,y;
  15. int a[][];
  16. int dx[]={,-,,};
  17. int dy[]={,,-,};
  18. char a1[][];
  19. bool vis[][];
  20. const int mod=;
  21.  
  22. struct node{
  23. int x,y,dfn;
  24. };
  25.  
  26. node fz(int x,int y,int dfn){
  27. node rtn;
  28. rtn.x=x;
  29. rtn.y=y;
  30. rtn.dfn=dfn;
  31. return rtn;
  32. }
  33.  
  34. bool pan(int x,int y){//判断函数,保证行走合法
  35. return x>=&&y>=&&x<=n&&y<=m&&vis[x][y]==&&a[x][y]==;
  36. }
  37.  
  38. queue<node> q;
  39. void bfs(){
  40. q.push(fz(x,y,));
  41. vis[x][y]=;
  42. int ans=,sum=;
  43. int cnt=,cz[];
  44. while(!q.empty()){
  45. node h=q.front();
  46. cz[++cnt]=h.dfn%mod;
  47. q.pop();
  48. for(int i=;i<;i++){
  49. int xx=h.x,yy=h.y,dfnn=h.dfn;
  50. if(pan(xx+dx[i],yy+dy[i])){
  51. xx+=dx[i];yy+=dy[i];
  52. q.push(fz(xx,yy,dfnn+));
  53. vis[xx][yy]=;
  54. if(dfnn+>ans) ans=dfnn+;
  55. }
  56. }
  57. }
  58. for(int i=;i<=cnt;i++)//我太菜了的求卷子数法qwq
  59. sum=(sum%mod+ans%mod-cz[i]%mod+)%mod;
  60. cout<<ans<<endl<<sum<<endl;
  61. }
  62.  
  63. int main(){
  64. n=read();m=read();
  65. char ch=getchar();
  66. for(int i=;i<=n;i++){
  67. for(int j=;j<=m;j++){
  68. while(ch==' '||ch=='\n'||ch=='\r') ch=getchar();
  69. a1[i][j]=ch;
  70. if(a1[i][j]=='*') x=i,y=j,a[i][j]=;
  71. if(a1[i][j]=='#') a[i][j]=;
  72. if(a1[i][j]=='o') a[i][j]=;
  73. ch=getchar();
  74. }
  75. }
  76. bfs();
  77. return ;
  78. }

end-

【6.28校内test】T1 Jelly的难题1的更多相关文章

  1. 2019.6.28 校内测试 T1 Jelly的难题1

    这题面有点难理解,建议直接跳到题意解释那一部分(虽然我觉得解释的不大对,但按照解释来做确实能AC): 按照“题意解释”的思路来思考这个题,那么就十分的简单了: 1.首先要读入这个字符矩阵,可以用cin ...

  2. T84341 Jelly的难题1

    T84341 Jelly的难题1 题解 当窝发现窝的锅在读入这个矩阵的时候,窝..窝..窝.. 果然,一遇到和字符串有关的题就开始吹空调 好啦我们说说思路吧 BFS队列实现 拿出一个没有走过的点,扩展 ...

  3. 【8.28校内测试】【区间DP】

    感受到了生活的艰辛QAQ...这才是真正的爆锤啊...(因为t1t3还没有理解所以只能贴t2叻QAQ 区间DP...爆哭把题理解错了,以为随着拿的东西越来越多,断点也会越来越多,出现可以选很多的情况Q ...

  4. 18清明校内测试T1

    消失的数字(number) Time Limit:1000ms   Memory Limit:128MB 题目描述 rsy拥有n个数,这n个数分别是a1,a2,…,an. 后来出现了一个熊孩子zhw, ...

  5. 2019.7.9 校内测试 T1挖地雷

    这一次是交流测试?边交流边测试(滑稽 挖地雷 这个题是一个递推问题. 首先我们看第一个格子,因为它只影响了它的上面和右上面这两个地方是否有雷. 我们可以分3种情况讨论: 1. 第一个格子的数字是2: ...

  6. 2019.6.28 校内测试 T4 【音乐会】达拉崩吧·上

    考试的一道附加题~ 一看题目描述:把区间[l,r]里每个数异或上x,求区间[l,r]里所有数的异或和,这明显的要用数据结构或RMQ吧. 恩,所以正解就是线段树啦,至于树状数组行与否,不知道~ wate ...

  7. 2019.6.28 校内测试 T3 【音乐会】道路千万条

    大眼一看最下面的题意解释的话,发现这和洛谷P1310表达式的值挺像的,大概都是给定一些运算符号,让最后的表达式为true的概率,为false的概率啥的QwQ~: 然后这个题嘛?就是在所有的运算符中提溜 ...

  8. 2019.6.28 校内测试 T2 【音乐会】二重变革

    看到这个题之后,一个很暴力很直接的想法就是贴上题目中的代码然后交上去走人,但是很显然这是会TLE+MLE的,想想谁会这么傻把主要代码给你QwQ~: 其实这段代码是想告诉你一件事:用序列中的大数减去小数 ...

  9. 【6.28校内test】T2 【音乐会】二重变革

    [音乐会]二重变革[题目链接] T2其实是一道数学题,因为你看: 2MB??一共就可以存下个int,然鹅再看数据范围: 那么大是稳稳的不是TLE就是MLE了,所以肯定是数学题,而且是只需要存很少数据的 ...

随机推荐

  1. C# 遍历控件名称

    List<string> list = new List<string>(); list.Add("textBox2"); list.Add("t ...

  2. jquery dblclick()方法 语法

    jquery dblclick()方法 语法 作用:当双击元素时,会发生 dblclick 事件.当鼠标指针停留在元素上方,然后按下并松开鼠标左键时,就会发生一次 click.在很短的时间内发生两次 ...

  3. TTTTTTTTTTT POJ 2749 修牛棚 2-Sat + 路径限制 变形

    Building roads Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7019   Accepted: 2387 De ...

  4. 使用git将代码上传到GitHub

    使用git将代码上传到GitHub   结束了前一段的时间的杂七杂八的生活,最近又快开始动一动已经吃了好长时间土的GitHub,以前的git指令基本上忘个差不多,现在记录一下,利用git将代码上传. ...

  5. Fermat小定理的证明

    本证明参考了李煜东老师<算法竞赛进阶指南>. 我们首先证明欧拉定理,然后推导出费马小定理. 欧拉定理:若\(\gcd(a,n)=1,a,n\in \mathbb{Z}\),则\(a^{\p ...

  6. Housewife Wind

    Housewife Wind 参考博客:POJ2763 Housewife Wind(树剖+线段树) 差不多是直接套线段树+树剖的板子,但是也有一些需要注意的地方 建树: void build() { ...

  7. [CSP-S模拟测试]:统计(树状数组+乱搞)

    题目传送门(内部题120) 输入格式 第一行,两个正整数$n,m$. 第二行,$n$个正整数$a_1,a_2,...,a_n$,保证$1\leqslant a_i\leqslant n$,可能存在相同 ...

  8. 「WC 2007」剪刀石头布

    题目链接 戳我 \(Solution\) 直接求很明显不太好求,于是考虑不构成剪刀石头布的情况. 我们现在假设一个人\(i\)赢了\(x\)场,那么就会有\(\frac{x*(x-1)}{2}\) 我 ...

  9. Java使用FileOutputStream写入文件

    From: http://beginnersbook.com/2014/01/how-to-write-to-a-file-in-java-using-fileoutputstream/ /* 使用F ...

  10. centos 系统时间设置

    在我们使用CentOS系统的时候,也许时区经常会出现问题,有时候改完之后还是会出错,下面我们就来学习一种方法来改变这个状况.如果没有安装,而你使用的是 CentOS系统 那使用命令 yum insta ...