【USACO】clocks 遇到各种问题 最后还是参考别人的思路
- //放在USACO上一直通不过 不知道哪里出了问题 输出的n总是等于1 但是BFS递归的次数是对的 《----这个问题解决了 局部变量压入queue中返回就是对的了
- #include<iostream>
- #include <fstream>
- #include<cstring>
- #include<queue>
- using namespace std;
- typedef struct
- {
- int clock[]; //当前状态
- int sq[]; //已扩展序号
- int n; //已扩展次数
- }CS;
- int clockadd(int* c)
- {
- int t = *c;
- if(t == )
- t = ;
- else
- t = t + ;
- *c = t;
- return ;
- }
- int Move(int m, int *clock)
- {
- switch(m)
- {
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- default:
- break;
- }
- return ;
- }
- int clockok(int * clock)
- {
- int i;
- for(i = ; i < ; i++)
- {
- if(clock[i] != )
- return ;
- }
- return ;
- }
- queue <CS> q;
- //CS tmp;
int BFS()- {
- int i, j;
- CS f = q.front();
- for(i = ; i <= ; i++)
- {
- CS tmp = f;
- tmp.n = f.n;
- Move(i, tmp.clock);
- tmp.n = tmp.n + ;
- tmp.sq[tmp.n - ] = i;
- if(clockok(tmp.clock))
- {
q.push(tmp);
return 0; //后面改成用 ans = q.back()即可- //return tmp;
- }
- else
- {
- q.push(tmp);
- }
- }
- q.pop();
- BFS();
- }
- int main()
- {
- fstream in, out;
- int i;
- CS first, ans;
- in.open("clocks.in", ios::in);
- out.open("clocks.out", ios::out);
- //初始化
- for(i = ; i < ; i++)
- {
- in >> first.clock[i];
- }
- memset(first.sq, , sizeof(first.sq));
- first.n = ;
- q.push(first);
- ans = BFS();
- for(i = ; i < ans.n; i++)
- {
- out << ans.sq[i] << " ";
- }
- out << "\n";
- return ;
- }
- ①放在USACO上一直通不过 不知道哪里出了问题 输出的n总是等于1 但是BFS递归的次数是对的。在自己的电脑上则是对的
- 解决:返回局部变量导致的错误 压入queue中再取出则是对的 具体原因还没搞清楚
- ②遇到新问题 递归溢出了了 递归到时钟旋转5次时会溢出 而有时答案要旋转很多次 如何提高效率?
解决: 这道题用递归大概不可以吧 我写的函数每次递归需要存储过多的变量 在上面程序中递归3000多次就溢出了 后来把递归函数内的各种局部变量都改到外面 改成全局的 不用每次递归创建 但是运行到7000多次也溢出了 对于本题需要4^9 = 363144次递归 远远超出了栈的内存限制 只好用9层循环了- 解题关键: 操作的顺序是无关紧要的!!!! 每种操作不会多于3次 否则就相当于没做了 AC的代码 非常的丑 之后尝试用这个思路对BFS剪枝 但是由于②中的分析原因 剪枝后还是溢出了
- 学习心得:能用循环的还是用循环吧 循环不好写 或是意义不明的在考虑递归!
- //用BFS做不出来 太不爽了 在网上看了别人的思路 每个操作做4次相当于没做 所以只对每个操作做0 - 3次 枚举即可
- #include<stdio.h>
- int clockadd(int* c)
- {
- int t = *c;
- if(t == )
- t = ;
- else
- t = t + ;
- *c = t;
- return ;
- }
- int clockok(int * clock)
- {
- int i;
- for(i = ; i < ; i++)
- {
- if(clock[i] != )
- return ;
- }
- return ;
- }
- int Move(int m, int *clock)
- {
- switch(m)
- {
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- case :
- {
- clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]); clockadd(&clock[]);
- }
- break;
- default:
- break;
- }
- return ;
- }
- int MoveN(int * clock, int * i)
- {
- int j, k;
- for(j = ; j < ; j++)
- {
- for(k = ; k < i[j]; k++)
- {
- Move(j+, clock);
- }
- }
- return ;
- }
- int main()
- {
- FILE *in, *out;
- in = fopen("clocks.in", "r");
- out = fopen("clocks.out", "w");
- int clock[];
- int i[] = {}, j, k;
- for(j = ; j < ; j++)
- {
- fscanf(in, "%d", &clock[j]);
- }
- for(i[] = ; i[] < ; i[]++)
- {
- for(i[] = ; i[] < ; i[]++)
- {
- for(i[] = ; i[] < ; i[]++)
- {
- for(i[] = ; i[] < ; i[]++)
- {
- for(i[] = ; i[] < ; i[]++)
- {
- for(i[] = ; i[] < ; i[]++)
- {
- for(i[] = ; i[] < ; i[]++)
- {
- for(i[] = ; i[] < ; i[]++)
- {
- for(i[] = ; i[] < ; i[]++)
- {
- int clockcp[];
- for(j = ; j < ; j++)
- {
- clockcp[j] = clock[j];
- }
- MoveN(clockcp, i);
- if(clockok(clockcp))
- {
- for(j = ; j < ; j++)
- {
- for(k = ; k < i[j]; k++)
- {
- fprintf(out, "%d ", j + );
- }
- }
- fseek(out, -, SEEK_END);
- fprintf(out, "\n");
- return ;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- 又看了下答案的解题思路 有个简便的算法是 先求出单独把每个时钟旋转90度需要对 1 - 9 的操作分别作多少次。 然后,求出输入的矩阵需要分别对 哪些时钟分别旋转几次 把需要的操作步数相加 模4 即可 <---很聪明的方法啊!
【USACO】clocks 遇到各种问题 最后还是参考别人的思路的更多相关文章
- 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 ...
- SQL高级查询——50句查询(含答案) ---参考别人的,感觉很好就记录下来留着自己看。
--一个题目涉及到的50个Sql语句 --(下面表的结构以给出,自己在数据库中建立表.并且添加相应的数据,数据要全面些. 其中Student表中,SId为学生的ID) ---------------- ...
- postman进行https接口测试所遇到的ssl证书问题,参考别人方法
参考文档: https://learning.getpostman.com/docs/postman/sending_api_requests/certificates/ 随着 https 的推动,更 ...
- selenium参考别人的定位元素方法
根据ID名称相同,定位第3个的手写方法 解决方案写法如下: //*[@id="weekDays" and @data-num="3"]
- 参考别人的代码写的aes加密,记录一下(AES,ECB模式,填充PKCS5Padding,数据块128位,偏移量无,以hex16进制输出)
package org.jimmy.autosearch2019.test; import java.security.SecureRandom; import javax.crypto.Cipher ...
- Remove Element(第一种方法参考别人)
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- c指针学习小结(参考别人总结的经验)
指针学习与总结一.1.int *p :p与*先结合,说明p是一个指针,然后与int结合说明指向的是一个int型的.2.int p[3] :p与[]结合说明p是一个数组,然后与int结合,说明数组里的元 ...
- 我为什么要拒绝Ctrl+C和Ctrl+V?
工作中避免不了会去参考别人的思路和实现(代码),因此浏览博文和相关网站成了日常活动.在这一过程中,James看到很多博文都是满篇的代码,而没有相应的分析(文字描述或者流程图). 对于上述这种情况,Ja ...
- 国内及Github优秀开发人员列表
自从入了Android软件开发的行道,解决问题和学习过程中免不了会参考别人的思路,浏览博文和门户网站成了最大的入口.下面这些列表取名为:国内及Github优秀开发人员列表,就是浏览后的成果. 虽然下述 ...
随机推荐
- golang thrift 总结一下网络上的一些坑
我们以hello world来大概分析一下golang中的thrift包,并且扒一扒网络上有关thrift的一些坑 查看源码,服务器定义如下:(详见simple_server.go文件) type T ...
- Spring与jsp表达式的产生的问题
今天遇到一个问题就是Spring标签与jsp表达式的问题 直接上代码 <form:form commandName="book" action="/book_upd ...
- 洛谷1352 CODEVS1380 没有上司的舞会
洛谷的测试数据貌似有问题,4个点RE不可避 CODEVS可AC —————— 10分钟后追记:在洛谷把数组范围开到10000+就过了 —————— 题目描述 Description Ural大学有N个 ...
- Sublime Text 3 笔记
Nearly all of the interesting files for users live under the data directory. The data directory is ~ ...
- GNUPLOT画图工具
http://blog.csdn.net/codingkid/article/details/7211492 不得不说这个工具实在是太强大了. 1.首先命令简单,不会有那么多的语法问题. 2.其次画图 ...
- ECSHOP验证码背景图修改教程
ECSHOP验证码背景图修改教程 ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2013-11-18 ECSHOP验证码背景图修改教程: ECSHOP前后台的某些地 ...
- ios 判断控制器是否是第一次进入画页的做法
什么是第一次进入画页,只viewDidLoad一次: 所以只需要在viewDidLoad中加一个标识就行了. 加一个成员变量,或者属性,用来记录这个标识 一旦viewDidLoad后,这个就说明不是第 ...
- LinkedList和ArrayList的区别/何时使用LinkedList和ArrayList
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList ...
- 下载安装resin-3.X服务器并配置到myeclipse
前提是先安装jdk,具体自己安装. 1.到resin官网http://www.caucho.com/download/下载相应压缩包,比如resin-3.2.0.zip 2.解压下载的resin-3. ...
- MySql数据类型详解
可配合http://www.cnblogs.com/langtianya/archive/2013/03/10/2952442.html学习 MySql数据类型 1.整型(xxxint) MySQ ...