摘要: 数独。。。 用DFS做。 刚开始想用一个列表表示某一列,某一行出现了哪些数,后来看到别人用二维数组挺方便的。 跟普通DFS差不多,不过要判断是否换行,能 深搜 到最后一个点 表示 DFS做完了。#include#include#includeusing namespace std;int map[12][12];bool row[12][12];bool col[12][12];bool g[12][12];bool DFS(int x,int y){ if(x==10) return true; bool flag=false; if(map[x][... 阅读全文
posted @ 2013-09-01 21:57 yongren1zu 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 题意:一共有 T 组测试数据,每组先给两个数,w,h,表示给一个 高h,宽w的矩阵,‘#’表示不能走,‘.’表示能走,‘@’表示起始点,问,从起始点出发能访问多少个点。 简单的BFS题,以前做过一次。#include#includestruct node{ int x,y;};node q[450];int head,tail;int visit[25][25];int dx[]={1,0,-1,0};int dy[]={0,1,0,-1};int w,h;int sx,sy;int ans;int OK(int x,int y){ if(x>=1 && x=1 & 阅读全文
posted @ 2013-09-01 21:51 yongren1zu 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 这道题跟poj 3411 差不多,不过这道题得用邻接表,不然就超时了,这道题我的代码跑了63MS,324K,我瞅了一下列表,好多人都跑了0MS,你NB!! DFS。 题意:有n 城市,r条路,有k这么多的钱。不同的路花费不一样,求从1到n最快且总花费不超过k的长度。这道题用邻接表还是比较快的,用POJ3411那道题用的保存信息的结构果断超时啊啊啊。。。用邻接表也TLE了几次,最后由增加了几句 if 语句,才算AC。/*FUCK!! 终于不超时了*/#include#includestruct node { int d,t,l; int next;}road[10010];i... 阅读全文
posted @ 2013-08-31 22:37 yongren1zu 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 题意:有m条路,n座城市,走这些路是要付费的,每条路由两种付费方案,设一条路两端是a,b,如果走完这条路在b点付费的话,应付r,如果走这条路之前在c点付费的话,应付p,求从1端点走到n端点的最小费用。 DFS 刚开始想到了用搜索,自己搜索学的不好,有几个问题解决不了,首先就是每个点可以走多次,不能用0,1标记一个点是否走过,如果不标记就可能在一直走一条循环路,还有就是不会回溯,总之,自己就是不会写... 网上抄的别人的代码,每个点最多可以走3次,回溯也挺简单...#include#includeint n,m;struct node{ int a,b,c,p,r;};node ... 阅读全文
posted @ 2013-08-31 21:13 yongren1zu 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 题意:一个人有一个代号K和一个优先等级P,一共有4种操作,0:结束,1:新建一个人,代号为K,优先等级为P,2:输出优先等级最大的人的代码,并删除该人,3:输出优先等级最小的人的代码,并删除该人。 用了C++ STL里的map容器,map容器有一个关键字,map容器自动按关键字排序。用map容器方便了好多呦~#include#include#includeusing namespace std;map elem;int main(){ int n; int k,p; while(scanf("%d",&n)) { if(!n) break; ... 阅读全文
posted @ 2013-08-28 21:37 yongren1zu 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 简单线段树。 只有两种操作,求一个区间的最大值,更改某一个点的值。由于是更改某一个点的值而不是改一个区间的值,所以就更新到了叶节点,反正对时间卡的也不严。#include#include#define N 200010#define max(a,b) (a)>(b)?(a):(b)int n,m;int w[N];struct node{ int L,R; int nmax;};node tree[N*4];int ans;void build(int id,int L,int R){ tree[id].R=R;tree[id].L=L; if(L==R) ... 阅读全文
posted @ 2013-08-28 21:31 yongren1zu 阅读(174) 评论(0) 推荐(0) 编辑
摘要: 题意:给你两个数B、N,求一个数的N次方最接近B。 先求出B的1/N次方:A,然后比较A和A+1的N次方那个更接近B#include#include int main(){ double a,b,n; while(1) { scanf("%lf%lf", &b,&n); if (n==0.0 && b==0.0) break; a = (int)(pow (b, 1 / n)); if (fabs(pow(a,n)-b) > fabs(pow(a+1,n)-b)) a+=1.0; ... 阅读全文
posted @ 2013-08-28 21:28 yongren1zu 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 伸展树。。。 赤果果地抄袭雷哥的代码:http://www.cnblogs.com/jianglangcaijin/archive/2013/01/21/2869148.html 题意:输入n,m。给你n个数,初始排列是1到n,然后有m个操作,每次操作给两个数L,R,把(L,R)区间上的数的顺序颠倒,输出最终的顺序。 伸展树就是二叉查找排序数,一个节点的左子树上的数都比它小,右子树上的数比它大。这道题要在首尾加上哨兵,即有n+2个数,操作(L,R),就是把L-1旋转至根节点,然后把R+1旋转至L-1的右子树,那么R+1的左子树就是区间(L,R),然后把这个区间颠倒。 因为是第一次看... 阅读全文
posted @ 2013-08-27 22:49 yongren1zu 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 1.什么是伸展树。 Splay Tree 中文叫伸展树,或者分裂树。伸展树是一种二叉排序树,它能在O(log n)内完成插入、查找和删除操作。它的优势在于不需要记录平衡树的冗余信息。 2.为什么会有伸展树 假设想要对一个二叉查找树执行一系列的操作,为了使整个查找时间更小,被查频率高的那些节点就应当经常处于靠近树根的位置。于是想到设计一个简单方法,在每次查找节点之后对树进行重构,把被查的节点搬至树根,这种自调整形式的二叉查找树就是伸展树,它会沿着某个被访问节点到树根之间的路径,通过一系列的旋转把这个被访问的节点搬移至树根。 3.怎样旋转搬移至树根? 假设当前被访问节点为X,X的父亲... 阅读全文
posted @ 2013-08-26 21:18 yongren1zu 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 字符串查找。 无耻的抄别人的代码,里面有两个函数自己没用过,算是又学到一些新知识吧。 sscanf(str,"%s %s",str1,str2);//把str分为str1,str2 bsearch();//二分查找函数 题意:给出两两对应的字符串,输入一个字符串,输出与他对应的字符串。#include#include#includetypedef struct{ char fn[11]; char en[11];}dict;dict a[100010];int q_cmp(const void * a,const void *b){ return strcmp((... 阅读全文
posted @ 2013-08-23 20:22 yongren1zu 阅读(147) 评论(0) 推荐(0) 编辑