UVA-11214 IDA*】的更多相关文章

题目链接 正解是IDA*+四个方向判重,但由于是个裸的可重复覆盖问题,可以用DLX水过~ 每个格子与放上皇后能干掉的标记连边,跑可重复覆盖DLX.注意要用IDA*来优化,否则会超时. #include<bits/stdc++.h> using namespace std; typedef long long ll; +; int n,m,np,ka; char s[N][N]; struct P {int x,y;} p[N*N]; bool ok(P a,P b) { ; ; ; ; } s…
移动一块连续的区间使得数列递增.问最少次数. 直接IDA*暴搜,只是我没有想到A*函数,所以就随手写了个连续递增块数作为估价函数,WA了,然后除以2,还是WA,除以3,WA,除以4...过了= = #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<list> #include<algorithm> using namespac…
本题题意: 输入一个n*m的棋盘,某些格子有标记,用最少的皇后占据或者攻击所以带标记的格子.皇后的攻击范围为同行同列和同对角线. 可以使用IDA*算法,即从样例可以发现只需要最多5个棋子就可以对棋盘上所有地方进行攻击,因而使用IDA*进行对应的剪枝即可. #include<cstdio> #include<cstring> using namespace std; ,maxd; ][];///表示皇后已经攻击的范围,vis[0][]中存储的是行,vis[1][]中存储的是每列,vi…
You have n equal-length paragraphs numbered 1 to n . Now you want to arrange them in the order of 1 ; 2 ;:::;n . With the help of a clipboard, you can easily do this: Ctrl-X (cut) and Ctrl-V (paste) several times. You cannot cut twice before pasting,…
题意: 皇后防御的范围是他所在横.竖.对角线,地图上的#为可以放旗子的地方.问最少放几个皇后能防守所有#. 分析: vis数组开4维,对应行.列.主对角线.副对角线 代码: #include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int map[15][15];int vis[4][30];int n,m;int maxn;in…
暴力,和八皇后很像,用表示i+j和i-j标记主对角线,但是还是要加一些的剪枝的. 1.最裸的暴搜 6.420s,差点超时 2.之前位置放过的就没必要在放了,每次从上一次放的位置开始放 0.400s #include<cstdio> #include<cstring> ; char G[maxn][maxn]; int maxd; int n,m; ],vis2[maxn<<]; bool dfs(int d,int si,int sj) { if(d == maxd){…
题目: 输入一个n*m的棋盘(n,m<10),某些格子有标记,用最少的皇后守卫(即占据或攻击)所有的标记的格子.输出皇后的个数. 思路: 一开始没有想到用迭代加深搜索,直接dfs结果还没写完就发现这样要枚举的量太大了……于是换用迭代加深搜索.对于每个格子有四个方向可以用i,j,i+j,i+j+maxn(下标要是正的)表示,当cur等于枚举的答案maxd就判断是不是所有的标记都被攻击了. 另外如果这个格子放上了皇后,那该皇后所在行的后边的格子就没必要枚举了,直接跳到下一行的开头就可以了. 将二维数…
参考了这哥们的博客 https://blog.csdn.net/hyqsblog/article/details/46980287  (1)atoi可以char数组转int, 头文件 cstdlib  (2)小技巧,倒过来存是用[len-i-1]  (3)这道题的关键在于怎么去构造这个搜索,以什么方式去搜索.这里搜索专门用两个参数来控制第几个数的第几个位置, 还有一个参数是改变的次数, 也就是深度.这里还要逆向思维,check的时候最后一个数, 可以不用递归了, 而是由前面两个数反过来推然后判断…
题意:输入一个n*m棋盘(n,m<10),某些格子有标记.用最少的皇后守卫(即占据或者攻击)所有带标记的格子. 分析:因为不知道放几个皇后可以守卫所有带标记的格子,即回溯法求解时解答树的深度没有明显的上限,所以使用迭代加深搜索. 将棋盘的每个格子标记为0~n*m-1,依次枚举守卫的皇后个数,枚举当前守卫的皇后个数下所有的放置情况,看是否能全部守卫.(枚举方式i:1~n,j:i+1~n……) #pragma comment(linker, "/STACK:102400000, 1024000…
IDA* 就是iterative deepening(迭代深搜)+A*(启发式搜索) 启发式搜索就是设计估价函数进行的搜索(可以减很多枝哦~) 这题... 理论上可以回溯,但是解答树非常恐怖,深度没有明显上界,加数的选择理论上也是无限的. 我们可以从小到大枚举深度maxd, 设计估价函数,当扩展到第i层,前i个分数的和为c/d,第i的分数为1/e,接下来至少需要(a/b+c/d)/(1/e)个分数,如果超过maxd-i+1,那么直接回溯就好了.. #include<cstdio> #inclu…