0x28 IDA*
一个早上做完了我真牛B
就是A*用于DFS啊,现在我才发现迭代加深真是个好东西。
poj3460 %了%了我们的目标是把它的顺序变对,那么第i个位置的值+1是要等于第i+1个位置的值的。对于一个操作,最多就能修正3个位置对应。这题我多迭代了一层时间就跑了多10倍有点恐怖
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int n,ans,c[];
int count()
{
int ret=;
for(int i=;i<n;i++)
if(c[i]+!=c[i+])ret++;
if(c[n]!=n)ret++;
return ret;
}
int u[];
void change(int l,int r,int be)
{
for(int i=;i<=n;i++)u[i]=c[i];
for(int i=l;i<=r;i++)c[be+i-l]=u[i];
for(int i=,j=;i<=n&&j<=n;i++,j++)
{
if(i==be)i=be+r-l+;
if(j==l)j=r+;
c[i]=u[j];
}
}
bool dfs(int k)
{
if(count()==)return true;
if(k>=ans)return false;
int t[];
for(int l=;l<=n;l++)
{
for(int r=l;r<=n;r++)
{
for(int be=;be+r-l<=n;be++)
{
if(l==be)continue;
memcpy(t,c,sizeof(t)); change(l,r,be);
int cc=count(); cc=cc%==?cc/:cc/+;
if(cc+k+<=ans)
{
if(dfs(k+))return true;
} memcpy(c,t,sizeof(c));
}
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);c[]=;
for(int i=;i<=n;i++)scanf("%d",&c[i]); for(ans=;ans<=;ans++)
{
if(dfs())break;
}
if(ans<)printf("%d\n",ans);
else printf("5 or more\n");
}
return ;
}
poj3460
poj2286 这题写的有点丑。。很好想啊,就是看中间有最多有多少个是相等的。英语太烂没看题意结果被No moves needed卡了半小时
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int u[][]={{,,,,,,},
{,,,,,,}};
int c[],ans;
char ss[];int num;
int count()
{
int sa[];memset(sa,,sizeof(sa));
sa[c[]]++;sa[c[]]++;sa[c[]]++;
sa[c[]]++;sa[c[]]++;
sa[c[]]++;sa[c[]]++;sa[c[]]++;
return -max(sa[],max(sa[],sa[]));
}
void change(int w)
{
if(w==)
for(int i=;i<;i++)swap(c[u[][i]],c[u[][i+]]);
else if(w==)
for(int i=;i<;i++)swap(c[u[][i]],c[u[][i+]]);
else if(w==)
for(int i=;i>;i--)swap(c[i],c[i-]);
else if(w==)
for(int i=;i>;i--)swap(c[i],c[i-]);
else if(w==)
for(int i=;i>;i--)swap(c[u[][i]],c[u[][i-]]);
else if(w==)
for(int i=;i>;i--)swap(c[u[][i]],c[u[][i-]]);
else if(w==)
for(int i=;i<;i++)swap(c[i],c[i+]);
else if(w==)
for(int i=;i<;i++)swap(c[i],c[i+]);
}
bool dfs(int k)
{
if(count()==){num=c[];return true;}
if(k>=ans)return false; change();
if(count()+k+<=ans)
{
ss[k+]='A';
if(dfs(k+))return true;
}
change(); change();
if(count()+k+<=ans)
{
ss[k+]='B';
if(dfs(k+))return true;
}
change(); change();
if(count()+k+<=ans)
{
ss[k+]='C';
if(dfs(k+))return true;
}
change(); change();
if(count()+k+<=ans)
{
ss[k+]='D';
if(dfs(k+))return true;
}
change(); change();
if(count()+k+<=ans)
{
ss[k+]='E';
if(dfs(k+))return true;
}
change(); change();
if(count()+k+<=ans)
{
ss[k+]='F';
if(dfs(k+))return true;
}
change(); change();
if(count()+k+<=ans)
{
ss[k+]='G';
if(dfs(k+))return true;
}
change(); change();
if(count()+k+<=ans)
{
ss[k+]='H';
if(dfs(k+))return true;
}
change(); return false;
}
int main()
{
while(scanf("%d",&c[])!=EOF)
{
if(c[]==)break;
for(int i=;i<=;i++)scanf("%d",&c[i]); for(ans=;;ans++)
{
if(dfs())break;
}
if(ans==)printf("No moves needed\n");
else
{
for(int i=;i<=ans;i++)printf("%c",ss[i]);
printf("\n");
}
printf("%d\n",num);
}
return ;
}
poj2286
poj1084 表扬一下自己,写完没CE随便调了调就A了。这个一开始想了个很错的做法就是判断每根火柴删除会删除多少矩阵,结果其实删了一个就会对其他有影响。正确的做法是找个矩阵把它全删了,算删了一个,看删多少次。这样预估函数肯定比实际小
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int n,ans;
bool mp[][];
bool check_square(int L,int x,int y)
{
for(int j=y;j<=y+L--;j++)
if(mp[*x-][j]==false||mp[*(x+L-)-][j]==false)return false;
for(int i=x;i<=x+L--;i++)
if(mp[*i][y]==false||mp[*i][y+L-]==false)return false;
return true;
}
bool find_square(int &L,int &i,int &j)
{
for(L=;L<=n+;L++)
for(i=;i+L-<=n+;i++)
for(j=;j+L-<=n+;j++)
if(check_square(L,i,j)==true)
return true;
return false;
}
bool bp[][];
int count()
{
memcpy(bp,mp,sizeof(bp));
int L,i,j,cnt=;
while(find_square(L,i,j)==true)
{
for(int v=j;v<=j+L--;v++)
{
mp[*i-][v]=false;
mp[*(i+L-)-][v]=false;
} for(int u=i;u<=i+L--;u++)
{
mp[*u][j]=false;
mp[*u][j+L-]=false;
}
cnt++;
}
memcpy(mp,bp,sizeof(mp));
return cnt;
}
bool dfs(int k)
{
if(count()==)return true;
if(k>=ans)return false; int L,i,j;
bool zz=find_square(L,i,j);
for(int v=j;v<=j+L--;v++)
{
mp[*i-][v]=false;
if(count()+k+<=ans)
{
if(dfs(k+))return true;
}
mp[*i-][v]=true; mp[*(i+L-)-][v]=false;
if(count()+k+<=ans)
{
if(dfs(k+))return true;
}
mp[*(i+L-)-][v]=true;
} for(int u=i;u<=i+L--;u++)
{
mp[*u][j]=false;
if(count()+k+<=ans)
{
if(dfs(k+))return true;
}
mp[*u][j]=true; mp[*u][j+L-]=false;
if(count()+k+<=ans)
{
if(dfs(k+))return true;
}
mp[*u][j+L-]=true;
}
return false;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int m;
scanf("%d%d",&n,&m);
memset(mp,true,sizeof(mp));
for(int i=;i<=m;i++)
{
int k;
scanf("%d",&k);
int mo=(k-)%(n+n+);
if(mo<n)mp[(k-)/(n+n+)*+][mo+]=false;
else mp[(k-)/(n+n+)*+][mo-n+]=false;
} for(ans=;;ans++)
{
if(dfs())break;
}
printf("%d\n",ans);
}
return ;
}
poj1084
0x28 IDA*的更多相关文章
- 【转】IDA Pro7.0使用技巧总结
俗话说,工欲善其事,必先利其器,在二进制安全的学习中,使用工具尤为重要,而IDA又是玩二进制的神器,以前在使用IDA的时候,只是用几个比较常用的功能,对于IDA的其他功能没有去研究,于是本着学习的精神 ...
- 逆向工程 - Reveal、IDA、Hopper、HTTPS抓包 等
目录: 一. iOS 如何做才安全 二.ipa文件 三.沙盒 中的数据 四.Reveal:查看 任何APP 的UI结构 五.反编译工具:IDA 六.反编译工具:Hopper Disassembler ...
- IDA的脚本IDC的一个简单使用
目的:主要是想学习一下IDA的IDC的脚本的使用.这里做了一个小的测试. 这里使用的是VS2015Community来生成文件的. 一.编写测试程序: 这里先生成我们的目标数据. 然后编写测试程序.得 ...
- 安卓动态调试七种武器之孔雀翎 – Ida Pro
安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...
- iOS程序逆向Mac下常用工具——Reveal、HopperDisassemble、IDA
原文在此 一.Reveal 1 一般使用 Reveal是ITTY BITTY发布的UI分析工具,可以很直观的查看App的UI布局.如下图所示: Reveal是需要付费的,需要89美元, ...
- IDA插件栈字符串识别插件
该插件是一款可以自动识别栈上局部变量为字符串的插件,字符串形式如下,并自动的加上注释 如图:可以自动识别栈上的字符串 项目主 ...
- Android动态方式破解apk进阶篇(IDA调试so源码)
一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...
- 计算机病毒实践汇总六:IDA Pro基础
在尝试学习分析的过程中,判断结论不一定准确,只是一些我自己的思考和探索.敬请批评指正! 1. IDA使用 (1)搜索.下载并执行IDA Pro,对可执行程序lab05-01.dll进行装载,分别以图形 ...
- IDA在内存中dump出android的Dex文件
转载自http://drops.wooyun.org/tips/6840 在现在的移动安全环境中,程序加壳已经成为家常便饭了,如果不会脱壳简直没法在破解界混的节奏.ZJDroid作为一种万能脱壳器是非 ...
随机推荐
- Selenium的文件上传JAVA脚本
在写文件上传脚本的时候,遇到了很多问题,包括元素定位,以及上传操作,现在总结下来以下几点: 1. 上传的控件定位要准确,必要时要进行等待 WebElement adFileUpload = drive ...
- 八叉树(Octree)Typescript 实现
Demo GitHub export class Octree { // 父&子树 private parent_node: any; private children_nodes: Octr ...
- 干货 | TensorFlow的55个经典案例
转自1024深度学习 导语:本文是TensorFlow实现流行机器学习算法的教程汇集,目标是让读者可以轻松通过清晰简明的案例深入了解 TensorFlow.这些案例适合那些想要实现一些 TensorF ...
- 基于MapReduce的贝叶斯网络算法研究参考文献
原文链接(系列):http://blog.csdn.net/XuanZuoNuo/article/details/10472219 论文: 加速贝叶斯网络:Accelerating Bayesian ...
- MVC传值前台
ViewBag.model = bLL.GetModel((int)id); ViewBag.RecruitmentTime = ViewBag.model.RecruitmentTime.ToStr ...
- ArrayList集合如何存储基本数据类型
ArrayList对象不能存储基本类型,只能存储引用类型的数据.类似 <int> 不能写,但是存储基本数据类型对应的包装类型是可以的. 所以,想要存储基本类型数据, <> 中的 ...
- centos 6.10 永久修改主机名
1> 修改配置文件 vim /etc/sysconfig/network #HOSTNAME=localhost.localdomain HOSTNAME=tomcat 2> 修改ho ...
- 路飞学城Python-Day108
96-分页器1 批量插入的方式就不能用ORM的create()方式去做了,因为create就是对sql进行insert的操作,sql最好不要每次有一条数据就去进行插入,最好的方式就是插入一组数据 fr ...
- 商品的CRUD操作
(1)新增商品:新增文档,建立索引 PUT /index/type/id{ "json数据"} PUT /ecommerce/product/1{ "name" ...
- kernel对NTP的API,系统调用函数
kenrel API for NTP kernel 提供两个API(即系统调用 system call)给应用程序NTP,去校准kernel system clock Kernel Applicati ...