- 博客(49)
- 资源 (5)
- 收藏
- 关注
原创 Ogre载入Ogitor导出的场景
版本:Ogre 1.7.2pagedgeometry 1.1.1 下载:http://code.google.com/p/ogre-paged/downloads/list (编译自行解决)Ogitor 0.4.4 在Ogitor安装目录下找到SampleApp_Source这个文件夹 把 DotSceneLoader.h,rapidxml.hpp,DotSceneLoa
2011-06-04 13:47:00 4080 8
原创 Weiler-Atherton多边形裁剪算法
这是一个通用的多边形裁剪算法,既可以裁剪凸多边形也可以裁剪凹多边。 通过下图来描述算法的执行过程 图中DCBA为裁剪窗口,dcba为要裁剪的多边形。在算法执行之前将多边形和裁剪窗口的交点分别加入他们的顶点序列。即图中的123456。 则多边形序列为:a,6,5,d,4,3,c,2,b,1 裁剪窗口序列为:A,5,4,D,C,1,B,2,3,6 从多边形顶点a开始按逆时针方向遍历多边形顶点。到达多边形与裁剪边界的交点6,此时线段是从裁剪区的外部进入裁剪区内部 (即交点6一个entering i
2010-11-15 22:17:00 20201 2
原创 Cohen-Sutherland线段裁剪算法
通过一个矩形的裁剪区域将整个屏幕分成9个部分,并为每一个部分赋予相应的区域码,然后根据端点的位置确定这个端点的区域码。 先判断能否完全接受或者完全排除一条线段,若以上2个判断无法直接得出,则逐步裁剪,选取一个位于裁剪区外的端点,把端点的区域码和裁剪边界的区域码进行逻辑与运算,若结果为真,则端点在该裁剪边界外部,这时将端点移向线段和该边界的交点处,如此循环,直到裁剪结束。 代码基本和书上一样,加了点自己的注释 1: #include 2: #incl
2010-11-15 15:21:00 21052 2
原创 Bresenham算法实现任意斜率直线绘制
参考《计算机图形学》 Donald.Hearn书中给出了斜率k在0-1之间的推导过程在k>=1时以y方向为单位步长递增,此时有x=(y-b)/b;d(low)=x-x(k)=( y(k+1)-b )/m-x(k);d(upper)=x(k+1)-x=x(k)+1-( y(k+1)-b )/m;p(k)=dx*(d(low)-d(upper))=2*dx*(y(k)+1-b)-2*dy*x(k)-dx;可以推出p(k+1)=p(k)+2*dx-2*dy(x(k+1)-x(k));其中x(k+1)-x(k)的值
2010-11-04 20:56:00 21542 3
原创 pku 3469(最大流,最小割)
题意:有N个工作要做,每个工作可以在2个CPU上运行,在每个CPU上有个耗费c1,c2。然后m行a,b,c,表示a,b不在同一个CPU上运行时要付出的额外耗费c。求一个分配方案使耗费最小。构图:2个CPU一个作源点,一个作汇点,一个工作在A上耗费C1,则往源点引一条边到此点,在B上耗费C2,则在此点往汇点引一条边C2。随后输入的a,b,c中,往a,b之间引一条容量为c的双向边。转换为最小割,因为若a和b不在一个CPU上运作时,那它们之间的边就会在割中。整个问题转化为求最小割,即求最大流#include
2010-06-03 12:58:00 1482
原创 pku 2349(最小生成树)
给出n个点的坐标和s个卫星 求最小生成树 因为每2个卫星之间可以直接通讯,所以可以删除s-1条边,然后输出删除s-1条边之后剩余的边中最长的边 #include #include #include #include using namespace std;const int N=505;class node //存储所有的边{publ
2010-05-28 16:58:00 624
原创 pku 2446(二分匹配)
题意就是一个棋盘,有N个hole,问能否用1*2的矩形覆盖所有的非hole点一个小陷阱就是输入的hole坐标的行和列是反的 对每一个点,和它的上下左右的点比较,如果没有越界且不是hole点,则在2分图中连一条边,最后求二分匹配,若最大匹配数等于棋盘点的总数减去hole点则有解,否则无解 19xx ms险过 #include using namespace std;
2010-05-27 15:42:00 699
原创 pku 1659 (Havel定理)
Havel定理参考:http://hi.baidu.com/roba/blog/item/0732d01645a9ec1b972b4380.html#send 知道这个定理之后就很简单了,要注意的是每个case之间要空行,否则不给PE而是直接WA。 #include #include using namespace std;class point{publ
2010-05-26 14:28:00 1020 1
原创 pku 2516(最小费用最大流)
很烦的构图,起初想把每一个供应地的每一种物品都拆成一个点,不过MLE了。之后看解题报告,因为每种物品互不影响,所以可以对每一种物品求一次费用流。用need和offer数组存下每一个商店和供应地对每种物品的需求和供应量。求之前可以判断一次是否有解,对每一种物品,求供和需的总和的大小,若有一种物品的需大于求,则无解,否则有解。 #include #include #incl
2010-05-14 12:07:00 784
原创 hdu 2222(AC自动机模板)
#include #include #include using namespace std;const int size=26;char key[55],dir[1000005];class ac_auto{ public: ac_auto *fail; ac_auto *next[size]; int
2010-05-13 14:06:00 1154 1
原创 pku 2762(强连通分量+缩点+DFS)
问给出的图中任意两点是否可以由u到v或者由v到u。求一次强连通分量,然后将每个分量看成一个点,若分量中一个点连通另一个分量中的点则这两个分量联通,然后DFS计算传递闭包。用cc数组记录每两个分量是否可达。 #include #include #include using namespace std;const int MAXN=1005;class node
2010-05-09 13:53:00 740
原创 pku 2186(强连通分量)
参考:http://www.cppblog.com/Darren/archive/2008/12/05/68682.html算法证明:http://www.cppblog.com/RyanWang/archive/2009/02/26/74984.aspx求一次强连通分量,然后将每个分量看作一个点,找一个唯一的出度为0的点,其分量内包含的点的数量即为结果。 #include #
2010-05-08 22:19:00 691
原创 pku 1716(差分约束)
类似于1201,只是这里所有权值均为2,构图的方法参考冯威的论文。 #include #include using namespace std; /* 传入源点s,numv存储点的个数,用dis数组存下最短路径值 edge[]为其邻接表 */ class node { public:
2010-05-08 09:28:00 492
原创 pku 1511(最短路径,spfa静态邻接表)
给出图的有向边,求源点到其它所有点的最短距离之和sum1和其他点到源点的最短路径和sum2,sum1+sum2即为所求按图中输入构造一个邻接表,然后将所有边转置后构造一个邻接表,用这两个表求两次最短路径,将他们的和相加即为结果 #include #include using namespace std;/* 传入源点s,numv存储点的个数,用dis数组存下最短路径值
2010-05-05 20:51:00 1006
原创 pku 3259(最短路径,spfa)
有n个农场,m条路径,w条虫洞路径。随后输入m条路径,要处理双向边。然后跟w条虫洞路径,输入这个路径值时要取反。构图然后spfa判环。 #include #include #include using namespace std;/*传入源点s,n存储点的个数,用dis数组存下最短路径值edge[i]存入与i相邻的点及其权值返回值为true则无负环,为
2010-05-02 08:57:00 683
原创 pku 3630(静态trie树)
用动态树TLE,改成静态后125ms。将输入字符串按字符串长度从大到小排序然后存入树中,若最后插入字符的引用次数大于1,则该字符串被覆盖。静态树的空间要开大一点,不然会RE #include #include #include using namespace std; class node { public: char str[11]; int
2010-04-29 22:16:00 833 1
原创 pku 1186(DFS+hash)
将方程一分为二,一半元素留在左边,另一边移至右边,然后分2次DFS,搜索左边的元素时,将每次取到的总和存入hash。若重复出现,则增加引用计数。DFS右边时,对每次总和在hash中查找,若找到该元素,则sum加上该元素的出现次数。注意右边的总和要取反。最终sum即为解的个数。 #include #include using namespace std;class n
2010-04-29 14:51:00 759
原创 hdu 1285(拓补排序)
第一个拓补排序,写的很烂。构图之后将第一个入度为0的点压入队列,然后逐个出队列,对于出队列的每个元素将与它相邻的点入度减1,然后找下一个入度为0的点压入队列,代码中的cnt用来判断是否有环。 #include #include using namespace std;const int MAXN=505;int a,b,mat[MAXN][MAXN],list[MAXN
2010-04-25 09:56:00 687
原创 pku 1010(DFS)
不加优化,暴力搜索大意就是给出不同种邮票的面值,再给出用户需求,问满足用户需求的最优解。感觉题目的数据范围描述有问题,数组开到50RE,开到500就AC了。用dfs找出所有的情况,对于满足customer要求的结果进行比较计数,若解更“优”,则替换最终结果的状态 #include using namespace std;int stamps[500];int res
2010-03-31 19:52:00 852
原创 pku 1847(最短路径,floyd)
要注意的是对于每个十字路口它所指向的第一个路口是不需要转向的,此时应把路径设为0,否则设为1. 最后的路径若值小于inf即为转向次数,否则不可通,输出 -1. #include using namespace std;const int num=150;int n,a,b,tmp,t; int dis[num][num]; //保存最短路
2010-03-14 15:31:00 771
原创 pku 1016(字符串)
题意比较繁琐:就是统计0-9的个数,然后将它们按顺序组成一个新的字符串。比如5553141,有3个5,1一个3,2个1,1个4.按顺序排列后就是 21131435。 一次统计称为一次迭代。最多迭代15次。最后会的出4种结果。 1.第一次迭代得到的结果和源字符串相等,这时输出n is self-inventorying 。 2.从某次迭代开始得到结果不再变化这时输出n is sel
2010-03-14 10:29:00 658 1
原创 pku 1014(多重背包)
题意就是有值为1-6的弹子球,给出它们的个数,问能否根据它们的价值平分弹子球。一个剪枝就是在它们总值为奇数时就可以判定不能平分,若总值为偶数,则取总值的一半为背包最大容量按多重背包处理。若最终刚好能够取到总值的一半,则可以平分。 #include using namespace std;int num,V; //num物品个数,V为最大容量int f[20005*6
2010-03-13 13:54:00 1021
原创 pku 1276(多重背包)
参考资料《背包九讲》将题目中的100000看成10000 贡献数次RE。 #include using namespace std;int num,V; //num物品个数,V为最大容量int f[100005];int c[15],w[15];//c[]物品重量,w[]物品价值void zero_one_pack(int cost,int weight){
2010-03-12 14:38:00 538
原创 pku 1308(并查集)
#include #include using namespace std;int pre[10005];bool flag;map mm;map::iterator it;void Union(int &start,int &end){ pre[end]=start;}int Find(int x){ if(pre[x]!=0) retu
2010-03-05 16:12:00 667
原创 pku 1323(贪心)
给出开始的牌的大小,求最少胜出几轮。初始化一个数组从1开始按递增排序,手中的牌递减排序,从最大的开始比较,若其他人的牌最大的都小于手中的某张牌,则胜出一轮,进行计数。否则他人胜出,将大的那张牌置0,避免重复计数。 #include #include #include int cmp(int &a,int &b){ return a>b;}using n
2010-03-01 12:17:00 752
原创 pku 2389(大数乘法模板)
#include #include using namespace std;void mult(char a[],char b[],char s[]){ int i,j,k=0,alen,blen,sum=0,res[100][100]={0},flag=0; char result[100]; alen=strlen(a);blen=strlen(b); f
2010-02-05 09:13:00 496
原创 pku 3277 (线段树+离散化)
因为区间最大到10的9次方,开这么大的空间内存肯定不够,所以要离散化,用map存入然后用iterator遍历得到的有序序列存入vector。然后以vector的下标建立线段树,统计时若结点不是叶子结点,则它的值为左右孩子的值之和,否则返回 底*高 。 参考 岳云涛 《浅谈线段树在信息学竞赛中的应用》 #include #include #include using
2010-01-16 19:44:00 619
转载 动态规划法求解RMQ
转自:http://blog.csdn.net/yysdsyl/archive/2009/06/28/4305263.aspx 题目描述:RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够。可以用线段树将算法优
2009-12-26 14:08:00 512
原创 pku 1018 ( 贪心 )
贪心方法就是将所有带宽排序离散化,从小到大枚举以min_band搜索, 在每台设备中寻找带宽大于min_band且价格最小的设备加入计算,到最后若算出的比值比max_t大则更新比值,实际做法我是用DFS将贪心当做剪枝条件。 #include #include #include using namespace std;int tag[105],bandwid
2009-12-20 09:03:00 535
原创 pku 2394(最短路径,dijkastra)
注意重边,多头牛同一位置。 #include #include using namespace std;vector vec;int map[505][505]; //地图int dis[505]; //保存最短路径的值int cow[105]; //保存牛在哪个农场bool visit[5
2009-12-15 19:14:00 717
转载 二分图匹配:匈牙利算法
本文来自:http://hi.baidu.com/the_centriest_magic/blog/item/ac83c11e07428517413417c6.html 囧囧地写个教程...大家看之前其实可以先到百度百科那里了解一下http://baike.baidu.com/view/501092.htm 二分图的最大匹配——匈牙利算法
2009-12-14 18:19:00 821
原创 pku 1611(并查集)
最初将每个元素初始化为一个集合,每次输入记录它的前一个值,找出前一个值的根和当前输入的根,将他们合并,并用一个ans[]记录以当前元素值为根的集合元素总个数,全部输入合并之后,find(0)找到0的根ans[root]即为所求。 #include int pre[30005],ans[30005]; //ans[]记录以此元素为根的树共多少元素int n,m,k
2009-12-12 18:46:00 502
原创 pku 2403(MAP容器的使用)
给定N对字符串和数值的对应序列, 给出一篇短文,求出包含序列中字符串的值的总和。首先输入string和int 用my_map[string]=int ; 将原先不存在于容器中的对象存入。 map.find(str) 查询元素的迭代器,若查询元素不在容器中,迭代器指向容器末尾。若find操作返回迭代器不指向容器末尾,则将其值加入sum输入短文以‘.’结尾 以空
2009-12-07 12:05:00 512
原创 pku 1328(贪心)
大意就是给出雷达覆盖的范围和岛的坐标,要求判断最少需要多少雷达覆盖全部的岛。 首先算出每个岛到岸边的距离小于等于d的区间范围 然后根据区间排序。让尽可能多的区间重叠。在比较的时候不断的压缩区间。没有y小于0的数据。 #include #include #include using namespace std;typedef struct w { float
2009-12-03 17:03:00 624
原创 pku 1047(字符串)
这几天学校的网络烂的可以,午夜12点前连个QQ都登不上,几天没做题了,找几个水题练练手~ 用到了字符串的简单乘法,再判断2个字符串是否循环相等。 #include #include using namespace std;bool jud(string &a,string &b){ //判断2个字符串是否循环相等 int size=(int)b.
2009-11-24 19:08:00 557
原创 pku 1083(DP)
#include #include using namespace std;int s1,s2;int memo[150][150];const int map[5][5]={ {5,-1,-2,-1,-3}, {-1,5,-3,-2,-4}, {-2,-3,5,-2,-2},
2009-11-24 17:44:00 439
原创 pku 1979(DFS)
简单DFS #include using namespace std;char map[22][22];bool memo[22][22];int num=1,col,row;void DFS(int r,int c){ if(r>0&&map[r-1][c]==.&&memo[r-1][c]==false){ ++num; memo[r
2009-11-17 16:52:00 462
原创 pku 1915(BFS)
用map数组记录下到过的位置可以保证不TLE#include #include #include using namespace std;typedef struct w { int row; int col;}point;int num,n,size;;const int move[8][2]={ {-2,-1},{-2,1},{-1,-2},{-1
2009-11-11 20:42:00 432
原创 pku 3356 (DP)
简单DP,注意有多个测试数据 用DP找出2个字串的最长子序列 ,然后用2个字符串中长度较长的字符串长度减去子序列长度即可 #include #include using namespace std;string str1,str2;int DP_LCS(int i,int j){ //DP if(i==-1 || j==-1) return 0;
2009-11-09 16:54:00 423
原创 pku 1157 (DP)
仍然是DP 要保证 第i行前面的所有行均有一个位置可以放花,所以要从对角线开始,保证其后面的位置至少有一个位置可以放花,所以 在v-(f-i-1) 处结束#include int A[101][101];int memo[101][101];int max=101*(-50);int f,v;int main(){ scanf("%d%d",&f,&v)
2009-11-07 22:31:00 457
Mathematics for 3D Game Programming and Computer Graphics 3Ed
2011-12-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人