1.  
  2. //放在USACO上一直通不过 不知道哪里出了问题 输出的n总是等于1 但是BFS递归的次数是对的 《----这个问题解决了 局部变量压入queue中返回就是对的了
  3. #include<iostream>
  4. #include <fstream>
  5. #include<cstring>
  6. #include<queue>
  7. using namespace std;
  8.  
  9. typedef struct
  10. {
  11. int clock[]; //当前状态
  12. int sq[]; //已扩展序号
  13. int n; //已扩展次数
  14. }CS;
  15.  
  16. int clockadd(int* c)
  17. {
  18. int t = *c;
  19. if(t == )
  20. t = ;
  21. else
  22. t = t + ;
  23. *c = t;
  24. return ;
  25. }
  26. int Move(int m, int *clock)
  27. {
  28. switch(m)
  29. {
  30. case :
  31. {
  32. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  33. }
  34. break;
  35. case :
  36. {
  37. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  38. }
  39. break;
  40. case :
  41. {
  42. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  43. }
  44. break;
  45. case :
  46. {
  47. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  48. }
  49. break;
  50. case :
  51. {
  52. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  53. }
  54. break;
  55. case :
  56. {
  57. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  58. }
  59. break;
  60. case :
  61. {
  62. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  63. }
  64. break;
  65. case :
  66. {
  67. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  68. }
  69. break;
  70. case :
  71. {
  72. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  73. }
  74. break;
  75. default:
  76. break;
  77. }
  78. return ;
  79. }
  80.  
  81. int clockok(int * clock)
  82. {
  83. int i;
  84. for(i = ; i < ; i++)
  85. {
  86. if(clock[i] != )
  87. return ;
  88. }
  89. return ;
  90. }
  91.  
  92. queue <CS> q;
  93. //CS tmp;

  94. int BFS()
  95. {
  96. int i, j;
  97. CS f = q.front();
  98. for(i = ; i <= ; i++)
  99. {
  100. CS tmp = f;
  101. tmp.n = f.n;
  102. Move(i, tmp.clock);
  103. tmp.n = tmp.n + ;
  104. tmp.sq[tmp.n - ] = i;
  105. if(clockok(tmp.clock))
  106. {
           q.push(tmp);
           return 0; //后面改成用 ans = q.back()即可
  107. //return tmp;
  108. }
  109. else
  110. {
  111. q.push(tmp);
  112. }
  113. }
  114. q.pop();
  115. BFS();
  116. }
  117. int main()
  118. {
  119.  
  120. fstream in, out;
  121. int i;
  122. CS first, ans;
  123. in.open("clocks.in", ios::in);
  124. out.open("clocks.out", ios::out);
  125.  
  126. //初始化
  127. for(i = ; i < ; i++)
  128. {
  129. in >> first.clock[i];
  130. }
  131. memset(first.sq, , sizeof(first.sq));
  132. first.n = ;
  133. q.push(first);
  134.  
  135. ans = BFS();
  136.  
  137. for(i = ; i < ans.n; i++)
  138. {
  139. out << ans.sq[i] << " ";
  140. }
  141. out << "\n";
  142.  
  143. return ;
  144. }
  1. ①放在USACO上一直通不过 不知道哪里出了问题 输出的n总是等于1 但是BFS递归的次数是对的。在自己的电脑上则是对的
  2.  
  3.   解决:返回局部变量导致的错误 压入queue中再取出则是对的 具体原因还没搞清楚
  4.  
  5. ②遇到新问题 递归溢出了了 递归到时钟旋转5次时会溢出 而有时答案要旋转很多次 如何提高效率?
    解决: 这道题用递归大概不可以吧 我写的函数每次递归需要存储过多的变量 在上面程序中递归3000多次就溢出了 后来把递归函数内的各种局部变量都改到外面 改成全局的 不用每次递归创建 但是运行到7000多次也溢出了 对于本题需要4^9 = 363144次递归 远远超出了栈的内存限制 只好用9层循环了
  6.  
  7. 解题关键: 操作的顺序是无关紧要的!!!! 每种操作不会多于3 否则就相当于没做了 AC的代码 非常的丑 之后尝试用这个思路对BFS剪枝 但是由于②中的分析原因 剪枝后还是溢出了
  8.  
  9. 学习心得:能用循环的还是用循环吧 循环不好写 或是意义不明的在考虑递归!
  1. //用BFS做不出来 太不爽了 在网上看了别人的思路 每个操作做4次相当于没做 所以只对每个操作做0 - 3次 枚举即可
  2. #include<stdio.h>
  3.  
  4. int clockadd(int* c)
  5. {
  6. int t = *c;
  7. if(t == )
  8. t = ;
  9. else
  10. t = t + ;
  11. *c = t;
  12. return ;
  13. }
  14.  
  15. int clockok(int * clock)
  16. {
  17. int i;
  18. for(i = ; i < ; i++)
  19. {
  20. if(clock[i] != )
  21. return ;
  22. }
  23. return ;
  24. }
  25.  
  26. int Move(int m, int *clock)
  27. {
  28. switch(m)
  29. {
  30. case :
  31. {
  32. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  33. }
  34. break;
  35. case :
  36. {
  37. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  38. }
  39. break;
  40. case :
  41. {
  42. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  43. }
  44. break;
  45. case :
  46. {
  47. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  48. }
  49. break;
  50. case :
  51. {
  52. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  53. }
  54. break;
  55. case :
  56. {
  57. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  58. }
  59. break;
  60. case :
  61. {
  62. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  63. }
  64. break;
  65. case :
  66. {
  67. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  68. }
  69. break;
  70. case :
  71. {
  72. clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
  73. }
  74. break;
  75. default:
  76. break;
  77. }
  78. return ;
  79. }
  80.  
  81. int MoveN(int * clock, int * i)
  82. {
  83. int j, k;
  84. for(j = ; j < ; j++)
  85. {
  86. for(k = ; k < i[j]; k++)
  87. {
  88. Move(j+, clock);
  89. }
  90. }
  91. return ;
  92. }
  93.  
  94. int main()
  95. {
  96. FILE *in, *out;
  97. in = fopen("clocks.in", "r");
  98. out = fopen("clocks.out", "w");
  99. int clock[];
  100. int i[] = {}, j, k;
  101.  
  102. for(j = ; j < ; j++)
  103. {
  104. fscanf(in, "%d", &clock[j]);
  105. }
  106.  
  107. for(i[] = ; i[] < ; i[]++)
  108. {
  109. for(i[] = ; i[] < ; i[]++)
  110. {
  111. for(i[] = ; i[] < ; i[]++)
  112. {
  113. for(i[] = ; i[] < ; i[]++)
  114. {
  115. for(i[] = ; i[] < ; i[]++)
  116. {
  117. for(i[] = ; i[] < ; i[]++)
  118. {
  119. for(i[] = ; i[] < ; i[]++)
  120. {
  121. for(i[] = ; i[] < ; i[]++)
  122. {
  123. for(i[] = ; i[] < ; i[]++)
  124. {
  125. int clockcp[];
  126. for(j = ; j < ; j++)
  127. {
  128. clockcp[j] = clock[j];
  129. }
  130. MoveN(clockcp, i);
  131. if(clockok(clockcp))
  132. {
  133. for(j = ; j < ; j++)
  134. {
  135. for(k = ; k < i[j]; k++)
  136. {
  137. fprintf(out, "%d ", j + );
  138. }
  139. }
  140. fseek(out, -, SEEK_END);
  141. fprintf(out, "\n");
  142. return ;
  143. }
  144.  
  145. }
  146. }
  147. }
  148. }
  149. }
  150. }
  151. }
  152. }
  153. }
  154.  
  155. }
  1.  又看了下答案的解题思路 有个简便的算法是 先求出单独把每个时钟旋转90度需要对 1 - 9 的操作分别作多少次。 然后,求出输入的矩阵需要分别对 哪些时钟分别旋转几次 把需要的操作步数相加 4 即可 <---很聪明的方法啊!

【USACO】clocks 遇到各种问题 最后还是参考别人的思路的更多相关文章

  1. Path Sum(参考别人,二叉树DFS)

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  2. SQL高级查询——50句查询(含答案) ---参考别人的,感觉很好就记录下来留着自己看。

    --一个题目涉及到的50个Sql语句 --(下面表的结构以给出,自己在数据库中建立表.并且添加相应的数据,数据要全面些. 其中Student表中,SId为学生的ID) ---------------- ...

  3. postman进行https接口测试所遇到的ssl证书问题,参考别人方法

    参考文档: https://learning.getpostman.com/docs/postman/sending_api_requests/certificates/ 随着 https 的推动,更 ...

  4. selenium参考别人的定位元素方法

    根据ID名称相同,定位第3个的手写方法 解决方案写法如下: //*[@id="weekDays" and @data-num="3"]

  5. 参考别人的代码写的aes加密,记录一下(AES,ECB模式,填充PKCS5Padding,数据块128位,偏移量无,以hex16进制输出)

    package org.jimmy.autosearch2019.test; import java.security.SecureRandom; import javax.crypto.Cipher ...

  6. Remove Element(第一种方法参考别人)

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  7. c指针学习小结(参考别人总结的经验)

    指针学习与总结一.1.int *p :p与*先结合,说明p是一个指针,然后与int结合说明指向的是一个int型的.2.int p[3] :p与[]结合说明p是一个数组,然后与int结合,说明数组里的元 ...

  8. 我为什么要拒绝Ctrl+C和Ctrl+V?

    工作中避免不了会去参考别人的思路和实现(代码),因此浏览博文和相关网站成了日常活动.在这一过程中,James看到很多博文都是满篇的代码,而没有相应的分析(文字描述或者流程图). 对于上述这种情况,Ja ...

  9. 国内及Github优秀开发人员列表

    自从入了Android软件开发的行道,解决问题和学习过程中免不了会参考别人的思路,浏览博文和门户网站成了最大的入口.下面这些列表取名为:国内及Github优秀开发人员列表,就是浏览后的成果. 虽然下述 ...

随机推荐

  1. golang thrift 总结一下网络上的一些坑

    我们以hello world来大概分析一下golang中的thrift包,并且扒一扒网络上有关thrift的一些坑 查看源码,服务器定义如下:(详见simple_server.go文件) type T ...

  2. Spring与jsp表达式的产生的问题

    今天遇到一个问题就是Spring标签与jsp表达式的问题 直接上代码 <form:form commandName="book" action="/book_upd ...

  3. 洛谷1352 CODEVS1380 没有上司的舞会

    洛谷的测试数据貌似有问题,4个点RE不可避 CODEVS可AC —————— 10分钟后追记:在洛谷把数组范围开到10000+就过了 —————— 题目描述 Description Ural大学有N个 ...

  4. Sublime Text 3 笔记

    Nearly all of the interesting files for users live under the data directory. The data directory is ~ ...

  5. GNUPLOT画图工具

    http://blog.csdn.net/codingkid/article/details/7211492 不得不说这个工具实在是太强大了. 1.首先命令简单,不会有那么多的语法问题. 2.其次画图 ...

  6. ECSHOP验证码背景图修改教程

    ECSHOP验证码背景图修改教程 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2013-11-18   ECSHOP验证码背景图修改教程: ECSHOP前后台的某些地 ...

  7. ios 判断控制器是否是第一次进入画页的做法

    什么是第一次进入画页,只viewDidLoad一次: 所以只需要在viewDidLoad中加一个标识就行了. 加一个成员变量,或者属性,用来记录这个标识 一旦viewDidLoad后,这个就说明不是第 ...

  8. LinkedList和ArrayList的区别/何时使用LinkedList和ArrayList

    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList ...

  9. 下载安装resin-3.X服务器并配置到myeclipse

    前提是先安装jdk,具体自己安装. 1.到resin官网http://www.caucho.com/download/下载相应压缩包,比如resin-3.2.0.zip 2.解压下载的resin-3. ...

  10. MySql数据类型详解

    可配合http://www.cnblogs.com/langtianya/archive/2013/03/10/2952442.html学习 MySql数据类型 1.整型(xxxint)   MySQ ...