摘要:
之前有听说如果在一个迷宫中一直沿着某一堵墙走的话,那么一定可以走出这个迷宫,这题讲的就是这个内容。这题的问法比较奇怪,问你沿着左边的墙,右边的墙走所花的时间和最少所花的时间。该题难点就在与如何让dfs的时候能够沿着墙走。其实是有规律的,那就是往左边走是顺时针方向dfs,往右走逆时针方向走dfs,每次要确定上一次来的方向,这样能够确定你第一次试探的方向是那个方向。例如:如果从最左边的墙进入的话,那么首先选择往上走,否则向前走,再否则向下走,最后还是没法走的话就向左走(往回走),走了之后就直接return,每次走了之后绝对不会再换方向搜索。这题竟然错在了手写的找最短路的队列上。代码如下:#in.. 阅读全文
摘要:
简单的dfs搜索,题目要求是骑士可以从任意一点出发走完整个棋盘的路径。字典序输出要注意八个方向的排列顺序。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>using namespace std;int N, M, dir[8][2] = {-2, -1, -2, 1, -1, -2, -1, 2, 1, -2, 1, 2, 2, -1, 2, 1};int visit[10][10], rec[100][2];bool judge(int x, int y){ if (x < 1 || 阅读全文
摘要:
这题用map就超时了,所以用字典树来优化,第一次写静态的,现在都不习惯用指针了。由于这里不要回到源点,所以不许要所有点的度都为偶数,零个或者两个均可,图也必须是连通的。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <string>using namespace std;char s1[15], s2[15];int idx = 0, flag = 0, ptr = 1;int set[2500005];struct Node{ int cnt, No; int 阅读全文
摘要:
这题用hash表做有点无病呻吟了,因为用map更快更简单。把字符串按每一位乘以相应的位置,再进行hash操作。这题还做的时候还遇到一个问题,在进行字符串复制的时候,由于直接sizeof(in)由于in在这个函数里面覆盖了全局的in所以in是一个指针变量,所以并不是15而是4,每次只赋值4个字节,肯定是错了点。代码如下:#include <cstring>#include <cstdio>#include <cstdlib>#define MOD 2000003using namespace std;char s[50], in[15], out[15];in 阅读全文
摘要:
该题的思路就是枚举所有的点,当然这么枚举要做到不能够重复和遗漏,所以我们约定值枚举对角线的两个点,最后将最终的结果除以2来计算。由于每次通过枚举对角线的两个点,我们还要计算出另外两个顶点的坐标,所以这里用了一个很牛的公式,直接作加减法就能够出来了,判定下是否为整数。理论上我们马上要到点集中去寻找有没有这两个点,显然这种做法的效率很低,所以这里要用hash表,将顶点的信息的查询优化到接近O(1)。这里把正方形计算另外两个顶点的公式记录如下(已知x1, x2, y1, y2, 求x3, y3, x4, y4): x1 + x2 = x3 + x4; y2 - y1 = x4 - x3; y1... 阅读全文
摘要:
不得不说上次看得的这句话是多么对,再差的Hash表都比map好,hash表的查找速度可不是logn能够比的。首先将5个部分拆成2+3,我们选取2的部分进行hash,然后再进行3重for循环。动态申请内存还是比不上静态的啊。代码如下:动态申请内存:#include <cstdio>#include <cstring>#include <cstdlib>#define MOD 20003using namespace std;int rec[105];struct Node{ int x; Node *next;}e[20003];void Hash(int k 阅读全文