摘要:题意不好理解,参考了人家的代码才看懂的题意,就是用某种编译方式,检测所给字符串是否合理,即求它的原串。两者长度一样,只不过新得的串是根据所给编译方式和左邻右舍的值来求得的。对于编译方式 rule:0其意思为:0 0 0 -->00 0 1 -->00 1 0 -->00 1 1 -->0......通俗来讲就是对于编译方式k,先把k转化为八位二进制串,8 -->0 0 0 0 1 0 0 0.。 用八位二进制串中的每个字符分别对应{0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1}跟详细的解
阅读全文
摘要:很简单的八皇后题目。单纯递归筛选。。。。分别用y-x, x+y,来标识对角线,这在刘汝佳书上都有讲的。代码如下:#include int chess[8][8], lu_to_rd[14], ru_to_ld[14], l[8], max; //lu_to_rd 表示主对角线(left&up to right&down) //同理,ru_to_ld标识副对角线
void dfs(int cur, int sum)
{ if(cur==8) { m...
阅读全文
摘要:不得不说这道题,对我来说很难,开始的时候甚至连题意都弄不清,看了人家的代码,看懂了第一种方法,第一种方法很好理解,但是比较耗时。因为它没次递归都得算出那些值有可能出现。就是每次递归中都得包含调用递归。代码如下:#include #include int stamp[10], maxstamp[10], ans[10], max, h, k;
void is_visit(int n, int cur, int sum, int *vis)
{ if(cur==h) return; for(int i = 0; i %3d\n",max); } return 0...
阅读全文
摘要:此文章来自:http://blog.csdn.net/jcwkyl/article/details/4137398王晓东老师编著的《计算机算法设计与分析》5.12节以“连续邮资问题”为例展示了回溯法的应用。讲解比较简略,对于搜索出一张新的邮票面值后如何更新最大连续邮资区间这一点没有过多的说明。以下是自己对于这一节学习的一点笔记。实际上,关于刚才所说的更新最大连续邮资区间的方法,可以归结到一种“等价类”的思想。与此相似的还有《编程之美》中“数组分割问题”的解法三,《编程之美》中“找符合条件的整数”的最后一种算法,JOJ 1903,JOJ 1278这些题目等等。以下先从头到尾把连续邮资问题复习一遍
阅读全文
摘要:看到这个题,很快的就敲出了全排列的递归程序,结果一直WA。。。。看人家的代码都没看明白,直到看到人家的解释才懂了。。。无语。。。原来自己想的情况太理想化了,没有考虑到特大圆,与特小圆存在的特例。如果一味的按照顺序相切下去,有可能存在与前面的大圆相交的情况。代码是在原来基础上改的,先贴以一下吧。代码如下:#include #include #include using namespace std;
double radii[10], recoder[10], MIN;
int comp(const void *a, const void *b)
{ return *(double*...
阅读全文
摘要:首先,这个不算原创,原文是洋文的,我翻译了一下写这个文章的人绝对是个大师,虽然知识并不是很深奥,不过想法真的很不错,值得学习两个月前忽然看见的这篇文章,昨天仔细读了一遍,翻译了一下,原文在此http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm这是我翻译的,里面有些地方翻译的不太对,有些地方我也不懂,你们谁要是看懂了就告诉我浮点数的比较Bruce Dawson两数完全相等整型数是精确的,浮点数并不是那样。举个简单的例子,0.2这个数无法用二进制的浮点数精确表示,并且有限的精度意味着微小的误差在经过多次操
阅读全文
摘要:题意不难理解,就是一个个排列排序的map的种数。对于4 3 2 1 , 可见可以先对4 3 交换,或者对3 2 交换,或者对 2 1 交换。然后分情况依次交换,共有16种map。还是回溯的简单利用。。。不难。。。代码如下:#include int num[10], _case, n;
void swap(int a, int b)
{ int temp = num[a]; num[a] = num[b]; num[b] = temp;
}
void print_case(int cur)
{ int f = 1; for(int i = 1; i nu...
阅读全文
摘要:下面的东西,你知道几个:1、不同的排列相同的运算符得到的结果不同,2、在生成排列前必须要排序数据。好了,对于这个题,也没有什么好说的,直接贴代码把;代码如下:#include #include using namespace std;
int num[5], possible;
void print_product(int cur, int product)
{ if(possible)return; if(cur==5) { if(product==23&&!possible) {possible = 1; } return;} print_produc...
阅读全文
摘要:求取列车公司最大利润,对于某一区间的车票要拒则全拒,此题类似与子集生成问题,开始的时候想用子集生成+判断合理性,但是觉得比较耗时,所以就一边列子集,一边判断合理性,以至于及时回溯。代码如下:#include int capacity, n, m, max;
int order[22][3], num[10];
void print_price(int cur, int price)
{ if(cur==m) { if(max<price) max = price; return; } int ff = 1, f[10] = {0...
阅读全文
摘要:#include #include bool f[26][26], visit[26][26];
int n, m;
int dfs(int u)
{ int ans = 0, t; for(int i = 0; i < n; i++) if(f[u][i]&&!visit[u][i]) { visit[u][i] = visit[i][u] = 1; t = dfs(i)+1; ans = ans < t?t:ans; visit[u][i] = visit[i][u] = 0; } ...
阅读全文
摘要:对于这个题,开始弄了个跑20ms的代码,一个小时的优化后,跑了12ms。。。。思路不难,就是把问题分成一步步的。每一步弄成个递归就行了。先贴一下20ms 的代码/代码如下:#include char f[5][5];
int n, max;
int is_caninset(int c, int l)
{ if(f[c][l]=='X'||f[c][l]=='/'||f[c][l]=='o')return 0; for(int i = l+1; i = 0; i--) if(f[c][i]=='X') break; else if(
阅读全文
摘要:回溯-理解中。。。寻找最短连线++++++(生成排列)还要注意缩短时间的技巧----及时回溯,代码经过努力有68ms优化到了24ms。。。还是不知道人家那种0ms 的神代码怎么写的。先贴一下自己的代码吧!!代码如下:#include #include #include int x[10], y[10], f[10], a[10], A[10];
double MIN, d[10], D[10];
void find_mindis(int n, int cur, double sum)
{ if(cur==n) { if(sumMIN)return; ...
阅读全文
摘要:对于这个题,我也尝试了多种结构,如链表,二叉树,数组;最后我还是按照类似插入排序的方法做出来的。以a,b,c, d为例,加入已经排好了a
#include void outputspace(int spacenumber)
{ for(int i = 0;i = 0; i--) { if(i==cur) { outputspace(cur); printf("if %c < %c then\n",'a'+f[i-1],'a'+cur); f[cur] = cur; if...
阅读全文
摘要:题意比较简单,简单的让我有点害怕自己犯想当然的毛病给三个数据 t-测试数据组数, n-字符串的长度, h-字符串中‘1’的个数。(其余的一定是‘0’)(我用的是STL中的库函数next_permutation())代码如下:#include #include using namespace std;
int main ()
{ int t, n, h; char p[20]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&h); p[n]=0; for(i...
阅读全文
摘要:还是题意理解不清,导致wa了2次,题意理解了就好做了,几乎是照抄课本上的代码, 没意思:!方法一:生成可重集的排列:代码如下:#include #include #include using namespace std;
char s[15];
void printf_permutation(int n, char *flag, int cur)
{ if(n==cur) { for(int i = 0; i #include #include using namespace std;
int main ()
{ int n; cha...
阅读全文