摘要:
1.如果在代码里面这么写 char *cp="123"; ... if(*cp) ... if(!*cp) ... 第一个if指cp这个指针当前指向的地址是否是cp最开始指向的字符串的有效位里面(不包含'\0') 第二个if当然就是反过来了 2.如果常量指针(const)要赋值给普通指针,必须加上显 阅读全文
摘要:
首先将原区间分块(设块的大小是T) 先处理处每一个数字的vector,蒲公英那题的vector一样 然后处理出\(f[i][j]\)数组,表示第\(i\)个块到第\(j\)个块之间出现了偶数次数字的个数 具体见代码,这里主要讲一下时间复杂度 时间复杂度不是\(O(n^2)\),实际上,应该是\(\s 阅读全文
摘要:
先说下我最开始的思路 我设计的估价函数是这么想的,因为估价函数必须优于实际情况嘛,我就考虑每走一步会改变什么,不难发现会把一些新的点加入连通块,我就让每一步中本来不该加入连通块(因为颜色不同)但是相连的点加入连通块,相当于每一步都加入了更多的块,肯定会比实际操作更优 比如说这个图 第一步加入这些块 阅读全文
摘要:
&x是x的地址,(int *)是把x的地址转换为int类型的指针,前面再加一个星号表示输出这个int指针的值。注意在内存中由于浮点数的储存形式,转换成int类型的指针的时候只取前四个字节,导致会输出一个很大的数 阅读全文
摘要:
首先是估价函数的解释 由于\(x\)较大,所以\(x\)一直平方是最快的能到达\(p\)及以上的方法,所以这个估价函数比实际代价小(或等) 再看\(gcd\)这个剪枝 把八种情况列出,如果\(x\)和\(y\)都是\(gcd=d\)的倍数,那么加减或翻倍之后的新的\(x\)和\(y\)一定也是\(d 阅读全文
摘要:
先简要解释一下从任何一个状态到目标状态的移动步数不可能小于所有数字当前位置与目标位置的曼哈顿距离之和 考虑一次移动,只能让一个数字的曼哈顿距离加一或者减一,而目标状态所有数字的曼哈顿距离都是0,所以得证 我们可以用普通的BFS做这道题目,由于边权是1,所以第一次搜索到的时候一定是最优情况 考虑用A* 阅读全文
摘要:
首先证明那个比较显然的推论 我们先证明一下一个小引理:搜索树边权(也是后继的代价减去前驱的代价)非负的优先队列BFS先出队的点一定比后出队的点的代价小或等于 用数学归纳法,假设前面已经出队的点满足以上性质,之前最后一个出队的点为\(x\),现在队列里面的队首是\(y\),那我们就是要证明\(x\)的 阅读全文
摘要:
A*算法,本质是对BFS的一种优化,无论这个BFS是普通的BFS(搜索树上边权为1)还是优先队列BFS(搜索树上的边权可能大于1) 蓝书上论证正确性那一段说的\(s\)指的是目标状态的某一状态(即\(s\)已经到达了目标状态但不一定最优)然后再去理解那一段话 但是,我想说的是,中间的点第一次被取出的 阅读全文
摘要:
如果是C语言,那么在定义了一个结构体之后,在声明这个结构体变量的时候必须要在类型前加上struct 比如 struct Student{ //声明结构体 char name[20]; //姓名 int num; //学号 float score; //成绩 }; struct Student stu 阅读全文
摘要:
enum Day { SUNDAY = -1, MONDAY = 3, TUESDAY, WEDNESDAY = 2, THURSDAY, FRIDAY, SATURDAY }; 这些类型的值分别是-1,3,4,2,3,4,5 所以从一个显性赋值的变量开始一直到下一个显性赋值的变量结束,中间的变量依 阅读全文