雕刻时光

just do it……nothing impossible
随笔 - 547, 文章 - 0, 评论 - 82, 阅读 - 86万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

随笔分类 -  搜索

1

摘要:题意::从起点到终点的所有的最短路中,找出离终点有X个路口的城市一共有几个开始我用最短路+DFS从起点开始搜,超时了换了一种方法,从终点开始搜,AC#includeint N;const int MAX=1e9;int use[1009];int dis[1009];int map[1009][1009];bool hash[1009];int tempget[1009];int maxDis;int allPoint;int start,end,shortNum;void dijk(){ int i,j,min,rj,from; dis[start]=0; for(i=1;... 阅读全文

posted @ 2013-09-30 14:33 huhuuu 阅读(361) 评论(0) 推荐(0) 编辑

摘要:题目的大意是给了你有限个棍子以及每个棍子的长度,而且所有的棍子都是由有限个长度相同的棍子截断得到的,让你求被截棍子的最小长度搜索剪枝神题,做的我够呛提供一个比较好的解题报告 http://www.cnblogs.com/mycapple/archive/2012/08/14/2638430.html比较奇怪的是数组开小了WA了,开大就过了代码还是比较挫的#include#include#include#includeusing namespace std;int shu[299];int hash[299];int feng,n,ok,chu,fail;int nhash[299];void 阅读全文

posted @ 2013-09-29 10:12 huhuuu 阅读(240) 评论(0) 推荐(0) 编辑

摘要:http://pat.zju.edu.cn/contests/pat-a-practise/1018在杭州各个点,有很多自助自行车的点,最大容纳点为CMAX,但比较适合的情况是CMAX/2,现在从起点到终点,在最短路的情况下,调整各个车站的自行车数量使之CMAX/2,问开始时要提供的自行车最少与最后剩余的自行车最少的路径最短路+DFS在DFS时加上一个剪枝 if(lenth>dis[first])return ;就可以通过所有点#include#define MAX 0x3ffffffint cmax,N,end,M;int node[599];int map[599][599];int 阅读全文

posted @ 2013-09-26 10:43 huhuuu 阅读(1128) 评论(0) 推荐(0) 编辑

摘要:http://pat.zju.edu.cn/contests/pat-a-practise/1021无环连通图也可以视为一棵树,选定图中任意一点作为根,如果这时候整个树的深度最大,则称其为 deepest root。 给定一个图,按升序输出所有 deepest root。如果给定的图有多个连通分量,则输出连通分量的数量。1.使用并查集判断图是否为连通的。2.任意选取一点,做 dfs 搜索,选取其中一个最远距离的点 A,再做一次 dfs,找到的所有距离最远的点以及点 A 都是 deepest root。考虑到为稀疏图,则使用动态链表#include#include#include#include 阅读全文

posted @ 2013-09-15 22:08 huhuuu 阅读(1814) 评论(0) 推荐(2) 编辑

摘要:有一些由“_"和"#"组成的图形,图形中由"#"拼成了"B"、"M"、"W"三种字母,。用程序识别这些字母,统计三个字母的个数。___###############___________________________________###################_______________________________#####################_____________________________#####_____________#####_____ 阅读全文

posted @ 2012-03-18 19:43 huhuuu 阅读(384) 评论(0) 推荐(0) 编辑

摘要:http://poj.org/problem?id=3272由于数据顶点5000,边50000所以用静态链表出度为0有多个,入度为0的点有一个用f[i]表示i到出度为0的点 的边 有几条g[j]表示j到入度为0的点 的边 有几条两次dfs一条边的起点qi,终点end结果Max=max(f[qi]*g[end])注意点:重边有效View Code #include<stdio.h>#include<iostream>#include<string.h>using namespace std;const int N=5009;struct data{ int x 阅读全文

posted @ 2011-12-01 22:02 huhuuu 阅读(310) 评论(2) 推荐(0) 编辑

摘要:http://poj.org/problem?id=3279一般都玩过的游戏翻转快,一块砖块翻开,其他周围四块跟它自己变的颜色相反如果直接搜索的话,2^(15*15)铁定超时了其实只要枚举2^15第一行,然后在此基础上贪心即第一行为map[1][j]==1,下面也为 1View Code #include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<cmath>using namespace std;int n,m,ret=0;bool 阅读全文

posted @ 2011-11-29 21:56 huhuuu 阅读(203) 评论(0) 推荐(0) 编辑

摘要:编程解决如下数学问题:有12升水,怎样利用一个8升和一个5升的容器将水分为两个6升?要求以如下格式打印出分水步骤。(20分) a12 b8 c5 12 0 0 * * * ( “*”表示当前状态下每个容器的盛水量) ...... 0 6 6View Code #include<iostream>#include<queue>#include<stack>using namespace std;struct data1{ int x,y,z; int use;}hash[19][19][19];int w,ll,rr;struct data{ int a,b, 阅读全文

posted @ 2011-10-29 22:33 huhuuu 阅读(1023) 评论(0) 推荐(0) 编辑

摘要:1 2 38 9 47 6 5View Code #include<stdio.h>#include<string.h>int map[99][99];int pi[4]={0,-1,0,1};int pj[4]={-1,0,1,0};int step=0;void dfs(int fi,int fj){ int i,k; for(i=0;i<=3;i++) { if(map[fi+pi[i]][fj+pj[i]]!=0) continue; for(k=1;;k++) { ... 阅读全文

posted @ 2011-10-27 21:30 huhuuu 阅读(247) 评论(0) 推荐(0) 编辑

摘要:三国杀摆放自己的英雄,使敌方英雄不管怎么摆都你赢N<=6暴力枚举自己英雄序列6!*敌方英雄序列6!*6判断这种题目还是不够仔细,错了几次View Code #include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>using namespace std;bool hash[9];int no[9];bool hash2[9];int no2[9];struct data{ int n; char name[9][29];}node[9];struct Na 阅读全文

posted @ 2011-10-08 21:46 huhuuu 阅读(230) 评论(0) 推荐(0) 编辑

摘要:哈密顿回路判断是个NP问题,只有爆搜才可以N=64,显然直接爆搜不行AAAA……其实可以缩成一个点ACACAC……缩成两个点(如单独存在A,C就需要两个AC)ACGACGACG……缩成三个点(如单独存在A,C,G就需要三个ACG)再DFS即可View Code #include<stdio.h>#include<string.h>int add[10];int ok=0;int all=0;int from;void fun(char ss[10]){ int i; int t=0; for(i=0;ss[i];i++) { if(ss[i]=='A') 阅读全文

posted @ 2011-08-29 14:22 huhuuu 阅读(2874) 评论(0) 推荐(1) 编辑

摘要:好久没写搜索的题目了500*500深搜肯定不行求最小步长,BFS,坐标有(-500,500),+500搞定ps:把状态量写成 i, j一类的,容易不混淆坐标。。。以前用X,Y表示一直要与数学里的坐标搞错的,囧写完由于用c提交CE了一次,cpp提交,一次AC...View Code #include<stdio.h>#include<iostream>#include<queue>#include<string.h>using namespace std;bool hash[1009][1009];int diri[4]={0,-1,0,1};in 阅读全文

posted @ 2011-07-28 14:52 huhuuu 阅读(641) 评论(0) 推荐(0) 编辑

摘要:想下递归过程注意位运算优先级小,加括号View Code #include<stdio.h>int k;int dfs(int left){ if((left-k)<=1||((left-k)%2)==1) { return 1; } return dfs((left-k)>>1)+dfs(left-((left-k)>>1));}int main(){ int n; while(scanf("%d%d",&n,&k)!=EOF) { printf("%d\n",dfs(n)); }} 阅读全文

posted @ 2011-07-26 16:06 huhuuu 阅读(263) 评论(0) 推荐(0) 编辑

摘要:给你电影院长宽K然后给你N给问题请你分配位子要求权值最小在权值相同时按I取最小还是相同就按J最小暴力搜索下就行不难,但是用等差公式算时没考虑周到。。。View Code #include<stdio.h>#include<math.h>#include<string.h>int ll[1009];bool map[109][109];int main(){ int n,len; memset(map,0,sizeof(map)); scanf("%d%d",&n,&len); int i2=(len+1)/2; int j 阅读全文

posted @ 2011-07-18 20:11 huhuuu 阅读(382) 评论(0) 推荐(0) 编辑

摘要:每搜到结果就随时在ji[]记录num是搜到的步数View Code #include<stdio.h>bool map[109][109];int ji[109],n,num;bool v[109];bool ok;void dfs(int s){ int ts,i; if(ok==1) return ; if(num==n) { ok=1; return ; } for(i=1;i<=n;i++) { if(map[s][i]==1&&v[i]==0) { num++; ji[num]=i; v[i]=1; dfs(i); if(ok==1) return 阅读全文

posted @ 2011-03-30 16:23 huhuuu 阅读(220) 评论(0) 推荐(0) 编辑

摘要:dp[i][j][k]记录在i,j格子里,剩下k步可以到达终点的路径条数View Code #include<stdio.h>#include<iostream>#include<math.h>using namespace std;bool map[109][109];int fa,fb,ea,eb,add;int f[4][2]={0,-1,-1,0,0,1,1,0};int dp[109][109][19];int n,m,all;int dfs(int a,int b,int step){ if(dp[a][b][step]!=-1)return d 阅读全文

posted @ 2011-03-23 20:48 huhuuu 阅读(406) 评论(0) 推荐(0) 编辑

摘要:无限RE后,换了个oj提交,AC了DFS搜索的关键是,找到下一步的方向,与准确的回朔View Code #include<stdio.h>int map[129][129];int Max,n;int f[4][2]={{0,-1},{-1,0},{0,1},{1,0}};void dfs(int a,int b,int step){ if(step>Max) Max=step; int sa,sb,i,j; for(i=0;i<=3;i++) { sa=a+f[i][0]; sb=b+f[i][1]; int ta=sa,tb=sb,sstep=step; if(ta 阅读全文

posted @ 2011-03-23 16:03 huhuuu 阅读(250) 评论(0) 推荐(0) 编辑

摘要:bfs搜索,两次分别从两个出口搜,开数组ste[i][j]时刻记录(更新)点i,j到出口的最短距离最后在ste[i][j]查找最大值……View Code #include<stdio.h>#include<iostream>#include<queue>using namespace std;int map[209][80];int hash[209][80];int ste[209][80];int Max;int p[4][2]={0,-1,-1,0,0,1,1,0};int w,h;struct data{ int tei; int tej; int 阅读全文

posted @ 2011-03-16 15:53 huhuuu 阅读(216) 评论(0) 推荐(0) 编辑

摘要:简单dfs搜索用全局变量max随时记录当时搜到的面积最大即可View Code #include<stdio.h>bool hash[109][109];int all,max;int n,m;int f[4][2]={0,-1,-1,0,0,1,1,0};void dfs(int x,int y){ int i,x1,y1; for(i=0;i<4;i++) { x1=x+f[i][0]; y1=y+f[i][1]; if(x1>=1&&x1<=n&&y1>=1&&y1<=m&&hash 阅读全文

posted @ 2011-03-12 15:04 huhuuu 阅读(210) 评论(0) 推荐(0) 编辑

摘要:一开始看还以为状态100种,搜索深度10000层,明显要爆内存或时间看了nocow解释,每种状态里每六个灯循环,就可以将基础状态找出:(按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯。例如:1,4,7...)这里可以发现循环一共就8种bool map[8][6]={ {0,0,0,0,0,0}, {0,0,1,1,1,0}, {0,1,0,1,0,1}, {0,1,1,0,1,1}, {1,0,0,1,0,0}, {1,0,1,0,1,0}, {1,1,0,0,0,1}, {1,1,1,1,1,1}};bu[8]={1,2,1,1,2,1,2,0};//达到每种状态的步 阅读全文

posted @ 2011-03-10 22:08 huhuuu 阅读(443) 评论(0) 推荐(0) 编辑

1
点击右上角即可分享
微信分享提示