//放在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 遇到各种问题 最后还是参考别人的思路的更多相关文章

  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. BZOJ3246 [Ioi2013]Dreaming

    Description Serpent(水 蛇)生活的地方有N个水坑,编号为0,...,N - 1,有M条双向小路连接这些水坑.每两个水坑之间至多有一条路径(路径包含一条或多条小路)相互连接,有些水坑 ...

  2. HDU2096 小明A+B

    入门级都没到的水题!看到顺便就做了,AC记录喜+1 Description 小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算. 对于大于等于100 ...

  3. 我对Padding Oracle Attack的分析和思考

    道哥的<白帽子讲web安全>有一章提到Padding Oracle Attack的攻击方式,据说这货在2011年的Pwnie Rewards上还被评为"最具价值的服务器漏洞&qu ...

  4. 五种开源协议的比较(BSD_Apache_GPL_LGPL_MIT)

    现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses/alphabetic ...

  5. jquery------脚注的使用

    index.jsp <script type="text/javascript" src="../js/my.js"></script> ...

  6. std::auto_ptr

    auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII,在构造的 ...

  7. VS2013配置Caffe卷积神经网络工具(64位Windows 7)——准备依赖库

    VS2013配置Caffe卷积神经网络工具(64位Windows 7)--准备依赖库 2014年4月的时候自己在公司就将Caffe移植到Windows系统了,今年自己换了台电脑,想在家里也随便跑跑,本 ...

  8. 检测端口状态的python脚本

    #!/usr/bin/env python import os,subprocess,socket,time,sys from urllib import urlencode from socket ...

  9. WAF绕过小结

    WAF介绍 什么是WAF? Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品. 基本/简单绕过方法: 1.注释符 http://www.site. ...

  10. 理解模板引擎Razor 的原理(转载)

    Razor是ASP.NET MVC 3中新加入的技术,以作为ASPX引擎的一个新的替代项.简洁的语法与.NET Framework 结合,广泛应用于ASP.NET MVC 项目.Razor Pad是一 ...