A寻路算法(Delphi)
ActionScript3.0(as3)实现的A寻路算法...-电脑资料
ActionScript3.0(as3)实现的A*寻路算法...-电脑资料曾经写过A*寻路算法的教程,但没有贴出任何代码,这次代码全都贴出,大家可以进一步学习我只是按照A*的基本思想,将A*寻路算法用AS3实现了一下,没有做太多的寻路优化等如果你本身已经会用A*寻路算法了,那么下面的代码也不必研究了代码中注释很多,就不贴过多的解释看代码以前,可以先看看下面这两篇文章,或者看代码的时候配合例子和教程来看A*(A星)寻路算法讲解A*寻路算法,DEMO展示在DEMO展示中,有三个版本,由于代码写了很久了,我也不记得下面贴出的代码是哪个版本的了,见谅,。
首先是文档类Index.as:package code{import flash.display.Sprite;import flash.text.T extField;import flash.text.T extFormat;public class Index extends Sprite{private var road:Road;public function Index(){stage.align = "TL";stage.scaleMode = "noScale";stage.showDefaultContextMenu = false;init();}//初始化private function init():void{road = new Road;addChild(road);road.x = GV.ROAD_INIT_X;road.y = GV.ROAD_INIT_Y;//地图规格申明var text:TextField = new TextField;text.htmlText = "地图规格:50*50方格,障碍物500方格寻路算法:A*(星)制作:sunbright";addChild(text);text.x = 25;text.y = 530;text.width = 500;text.selectable = false;text.mouseEnabled = false;text.setTextFormat(new TextFormat("宋体",12,0xffffff));text = null;}}}定义参数的类:GV.aspackage{public class GV{public function GV(){throw new Error("变量");}//Road创建的初始x、y坐标public static const ROAD_INIT_X:int = 25;public static const ROAD_INIT_Y:int = 25;//纵横方块参数public static const WIDTH_NUMBER:int = 50; public static const HEIGHT_NUMBER:int = 50; public static const WIDTH_TOTAL:int = 500; public static const HEIGHT_TOTAL:int = 500; public static const GRID_WIDTH:int = 10;public static const GRID_HEIGHT:int = 10;//障碍物个数public static const THING_NUMBER:int = 500;//state状态参数表示public static const HAVE_THING:int = 1;public static const IMPASSE_VALUE:int = 2; public static const MAIN_VALUE:int = 8;//路径耗费固定值public static const BIAS_VALUE:int = 14;public static const LINE_VALUE:int = 10;//文本表示public static const IMPASSE:String = "死路!"; public static const RESULT_FRONT:String = "用时 "; public static const RESULT_BACK:String = " 毫秒"; }}主要算法所存在的Road.as类package code{import flash.display.Sprite;import flash.events.MouseEvent;import flash.text.T extField;import flash.text.T extFormat;import flash.utils.clearInterval;import flash.utils.getTimer;import flash.utils.setInterval;public class Road extends Sprite{private var lands:Sprite;private var things:Sprite;private var c:Coordinate;private var main:Main;private var click:Sprite;private var drawPath:Sprite;private var result:TextField;private var unlockList:Array;private var lockList:Object;private var targetIX:int;private var targetIY:int;private var intervalID:int = 0;private var startTime:int;private var endTime:int;public function Road(){init();}//初始化private function init():void{//创建坐标c = new Coordinate;//创建文本框result = new TextField;result.mouseEnabled = false;result.autoSize = "left";result.y = -20;result.selectable = false;result.defaultTextFormat = new TextFormat("宋体",12,0xffffff); addChild(result);result.text = "结果";//创建平原lands = new Sprite;lands.mouseChildren = false;lands.mouseEnabled = false;addChild(lands);lands.graphics.beginFill(0xff0000);lands.graphics.lineStyle(0);lands.graphics.drawRect(0,0,GV.WIDTH_TOTAL,GV.HEIGHT_T OTAL);for(var i:int = 1; i < GV.WIDTH_NUMBER; i ++){lands.graphics.moveTo(GV.GRID_WIDTH * i,0);lands.graphics.lineTo(GV.GRID_WIDTH * i,GV.HEIGHT_TOTAL);lands.graphics.endFill();lands.graphics.moveTo(0,GV.GRID_HEIGHT * i);lands.graphics.lineTo(GV.WIDTH_TOTAL,GV.GRID_HEIGHT * i);lands.graphics.endFill();}//创建障碍层things = new Sprite;things.mouseChildren = false;things.mouseEnabled = false;addChild(things);//创建路线绘制层drawPath = new Sprite;addChild(drawPath);//创建操控人main = new Main;addChild(main);//创建控制区click = new Sprite;click.graphics.beginFill(0,0);click.graphics.drawRect(0,0,GV.WIDTH_TOTAL,GV.HEIGHT_TO TAL);addChild(click);click.addEventListener(MouseEvent.CLICK,clickHandle);//开始初始化randomState();createRoad();}//随机生成障碍private function randomState():void{var ix:int;var iy:int;var i:int = 0;//随机障碍while(i < GV.THING_NUMBER){ix = int(Math.random() * GV.WIDTH_NUMBER);iy = int(Math.random() * GV.HEIGHT_NUMBER);if(c[ix][iy] == null){i ++;c[ix][iy] = GV.HAVE_THING;}}//随机摆放操控人while(true){ix = int(Math.random() * GV.WIDTH_NUMBER);iy = int(Math.random() * GV.HEIGHT_NUMBER);if(c[ix][iy] == null){c[ix][iy] = GV.MAIN_VALUE;break;}}}//创建马路现状private function createRoad():void{for(var i:int = 0; i < GV.WIDTH_NUMBER * GV.HEIGHT_NUMBER; i ++){var state:State = new State;var ix:int = i % GV.WIDTH_NUMBER;var iy:int = Math.floor(i / GV.HEIGHT_NUMBER);state.value = c[ix][iy];switch(state.value){case GV.HAVE_THING://如果等于1表示有障碍var thing:Thing = new Thing;thing.x = ix * GV.GRID_WIDTH;thing.y = iy * GV.GRID_HEIGHT;things.addChild(thing);thing = null;break;case GV.IMPASSE_VALUE://如多等于2表示死路//死路只需将value设置成2即可!break;case GV.MAIN_VALUE://如果等于8表示操控人main.x = ix * GV.GRID_WIDTH;main.y = iy * GV.GRID_HEIGHT;break;}c[ix][iy] = state;}}//点击触发private function clickHandle(e:MouseEvent):void{drawPath.graphics.clear();targetIX = Math.floor(e.localX / GV.GRID_WIDTH);targetIY = Math.floor(e.localY / GV.GRID_HEIGHT);//时间记录startTime = getTimer();var path:Array = seekRoad();endTime = getTimer();//根据路径开始走路walkRoad(path);path = null;}//开始走路private function walkRoad(path:Array):void{//显示寻路消耗时间result.text = GV.RESULT_FRONT + (endTime - startTime) + GV.RESULT_BACK;//判断是否为死路if(path.length == 0){result.text = GV.IMPASSE + result.text;}drawPath.graphics.lineStyle(2,0xffffff);path.just = true;intervalID = setInterval(walkRoadHandle,50,path);}//走路处理private function walkRoadHandle(path:Array):void{//是否路已经走完if(path.length == 0){//结束走路clearInterval(intervalID);//开启触发器click.mouseEnabled = true;return;}//开始走路var obj:Object = path.shift();main.x = obj.x;main.y = obj.y;bj = null;//绘制路径if(path.just){path.just = false;drawPath.graphics.moveTo(main.x + 5,main.y + 5);}else{drawPath.graphics.lineTo(main.x + 5,main.y + 5);}}//开始寻路private function seekRoad():Array{//关闭触发器click.mouseEnabled = false;//判断目标点是不是有障碍,或者是不是死路if(c[targetIX][targetIY].isThing c[targetIX][targetIY].isWalk){ return new Array;}//寻路初始化var path:Array = new Array;unlockList = new Array;lockList = new Object;//初始标记var ix:int = main.ix;var iy:int = main.iy;//创建开始标记var sign:Sign = new Sign(ix,iy,0,0,null);lockList[ix + "_" + iy] = sign;while(true){//生成八个方向的标记开启addUnlockList(createSign(ix + 1,iy - 1,true ,sign)); addUnlockList(createSign(ix + 1,iy ,false,sign)); addUnlockList(createSign(ix + 1,iy + 1,true ,sign)); addUnlockList(createSign(ix - 1,iy + 1,true ,sign)); addUnlockList(createSign(ix ,iy + 1,false,sign)); addUnlockList(createSign(ix - 1,iy ,false,sign)); addUnlockList(createSign(ix - 1,iy - 1,true ,sign)); addUnlockList(createSign(ix ,iy - 1,false,sign));//判断开启列表是否已经为空if(unlockList.length == 0){break;}//从开启列表中取出h值最低的标记unlockList.sortOn("f",Array.NUMERIC);sign = unlockList.shift();lockList[sign.ix + "_" + sign.iy] = sign;ix = sign.ix;iy = sign.iy;//判断是否找出路径if(ix == targetIX && iy == targetIY){while(sign != null){path.push(sign.getSign());sign = sign.p;}break;}}sign = null;return path.reverse();}//添加到开启标记列表private function addUnlockList(sign:Sign):void{if(sign){unlockList.push(sign);unlockList[sign.ix + "_" + sign.iy] = sign;}}//生成标记private function createSign(ix:int,iy:int,p:Boolean,_p:Sign):Sign{//是否出格if(ix < 0 iy < 0 ix >= GV.WIDTH_NUMBER iy >= GV.HEIGHT_NUMBER){return null;}//是否有障碍物if(c[ix][iy].isThing){return null;}//是否已经加入关闭标记列表if(lockList[ix + "_" + iy]){return null;}//是否已经加入开启标记列表if(unlockList[ix + "_" + iy]){return null;}//判断当斜着走的时候,它的上下或者左右是否有障碍物if(p){if(c[_p.ix][iy].isThing c[ix][_p.iy].isThing){return null;}}var cx:Number = Math.abs(targetIX - ix);var cy:Number = Math.abs(targetIY - iy);return new Sign(ix,iy,p ? GV.BIAS_VALUE : GV.LINE_VALUE,(cx + cy) * 10,_p);}}}标记数据记录,Sign.as类package code{public class Sign{private var _ix:Number;private var _iy:Number;private var _p:Sign;private var _f:int = 0;private var _g:int = 0;private var _h:int = 0;//f表示路径评分、g表示当前移动耗费、h表示当前估计移动耗费//公式:f = g + h,表示路径评分的算法//ng值表示以父标记为主标记的g值//nh值表示当前估计移动耗费public function Sign(_ix:Number,_iy:Number,ng:int,nh:int,_p:Sign = null){ this._ix = _ix;this._iy = _iy;this._p = _p;if(_p){_g = _p.g + ng;_h = nh;_f = _g + _h;}}//获取该标记的坐标public function getSign():Object{return {x:_ix * GV.GRID_WIDTH,y:_iy * GV.GRID_HEIGHT};}//获取它表示的x坐标public function get ix():int{return _ix;}//获取它表示的y坐标public function get iy():int{return _iy;}//获取父标记public function get p():Sign{return _p;}//获取路径评分public function get f():int{return _f;}//获取当前路径移动耗费public function get g():int{return _g;}//获取当前路径耗费估值public function get h():int{return _h;}//重写toString值public function toString():String{ return ix + "," + iy;}}}某点状态类,State.aspackage code{public class State{public var value:int = 0;public function State(){}//获取是否障碍public function get isThing():Boolean{ return value == GV.HAVE_THING;}//获取是否死路public function get isWalk():Boolean{return value == GV.IMPASSE_VALUE;}//重写toStringpublic function toString():String{return value.toString();}}}物体类:Thing.aspackage code{import flash.display.Sprite;public class Thing extends Sprite{public function Thing(){init();}//初始化private function init():void{graphics.beginFill(0);graphics.drawRect(0,0,GV.GRID_WIDTH,GV.GRID_HEIGHT); mouseEnabled = false;mouseChildren = false;}}}坐标系类,Coordinate.aspackage code{public dynamic class Coordinate extends Array{public function Coordinate(){init();}//初始化private function init():void{for(var i:int = 0; i < GV.WIDTH_NUMBER; i ++){push(new Array(GV.HEIGHT_NUMBER));}}}}主角类,Main.aspackage code{import flash.display.Sprite;public class Main extends Sprite{public function Main(){init();}//初始化private function init():void{graphics.beginFill(0x0000ff);graphics.drawRect(0,0,GV.GRID_WIDTH,GV.GRID_HEIGHT); mouseEnabled = false;mouseChildren = false;}//获取ix坐标public function get ix():int{return int(x / GV.GRID_WIDTH);}//获取iy坐标public function get iy():int{return int(y / GV.GRID_HEIGHT);}}}源文件打包下载下载源文件,直接打开move.fla运行即可。
浅谈游戏中自动寻路算法的实现与应用
浅谈游戏中自动寻路算法的实现与应用作者:蒋恺来源:《中国新通信》 2018年第2期在信息技术的支持下,互联网进入了迅猛发展期,各种网游、页游大量出现,受到不同玩家的喜爱与青睐。
当然为了逐步扩大受众群,需要不断的优化游戏,满足玩家对游戏的需求,其中自动寻路算法就是十分关键的技术之一,提升了游戏角色在虚拟游戏环境中的灵活性,更利于对游戏角色的控制,是判断游戏质量的重要标准之一”1。
一、关于自动寻路算法的概述1.1自动寻路算法的原理在自动寻路算法中最常用的为A*算法,这属于启发式的算法,被广泛应用于游戏中的路径搜索【21。
主要是节点的设置,具有记录、搜索进度的功能,通过节点在游戏地图中移动,当搜寻到目标位置时就结算,否则会进一步搜索记录目标位置周围相邻的位置。
举例而言,游戏角色最初的位置就是开始节点,将要到达的目标位置设置为目标节点,在两者之间存在一定的障碍物和可以顺利通行的路径,黑色部分为障碍物,白色部分为可通行路径,具体如下图1所示:在设计A*算法时采用的基本原理,其实为最短路径算法,在整个游戏地图中,从起始节点到目标节点的路径多种多样,将这些全部读入到开放式列表中,再通过与目标节点距离最近的节点进行对比,从而找到最优路径”1。
将上图1中的起始节点设置为A,目标节点力B,在计算最优路径节点C时需要在考虑几何距离基础上使用计算公式:(A—C)2+fB—C)2在A*算法中通过对各个不同节点的计算,从而找出路径最短最优的节点,但这一算法具有一定的缺陷,很可能要将整个地图上的节点都计算完了才能得出结果,当游戏场景复杂且节点数量过多的话,会大大增加游戏设计制作中的寻路算法的费用。
为此,就要对A*算法进行优化改进,以便扩大应用范围,满足玩家的游戏需求。
1.2自动寻路算法的实现为了最快的找到游戏地图中的最优路径,需要将游戏场景进行网格划分,让每个网路成为大小相同的正方形,成为游戏中的导航网格,就可以选择一个节点起始位置,进行目标节点位置的广度搜索,在确定区域后在计算最佳路径。
delphi 查找算法
例如,要找关键字为22的记录。
由索引的第一项可知,要找的记录要么在 第二块中,要么不存在。并获取第二块中 第一个记录的位置。
主目录 本章要点 上一页 下一页 退 出
对以上几种查找方法做出比较: (1)平均查找长度:折半查找最小,分块查 找次之,顺序查找最大; (2)表的结构:顺序查找对有序表、无序表 均适用;折半查找仅适用于有序表;分块查 找要求表中元素是逐段有序的,就是块与块 之间的记录按关键字有序; (3)存储结构:顺序查找和分块查找对向量 和线性链表结构均适用;折半查找只适用于 向量存储结构的表,因而要求表中元素基本 不变,而在需要插入或删除运算时,要移动 元素,才能保持表的有序性,所以影响了查 找效率。
中序遍历二叉排序树可以
得到一个递增有序序列。
1
二叉排序树的插入
插入:
1、若二叉排序树是空的,则key成为二叉排序树的根;
2、若二叉排序树非空,则将key与二叉排序树的根进行比较, 如果key的值等于根结点的值,则停止插入;如果key的 值小于根结点的值,则将key插入左子树;如果key的值 大于根结点的值,则将key插入右子树。
…
f
c
…
pr
q
cl
cl
s
q
ql
sl
ql sl
s pr
主目录 本章要点 上一页 下一页 退 出
(2)首先找到p结点在中序序列中的直接前驱s结点,然后 用s结点的值替代p结点的值,再将s结点删除,原s结点的 左子树改为s的双亲结点q的右子树:
p->data=s->data; f p c q->rchild=s->lchild;
delphi中locate查找方法
TDataSet控件以及它的继承控件,例如TSimpleDataSet/TClientDataSet等都可以使用Locate方法在结果数据集中查寻数据。
程序首先必须使用SQL命令从后端数据库中取得数据并且形成结果数据集,然后才使用Locate方法查寻数据。
当使用Locate方法查寻数据时,开发人员可以使用任何的字段条件来查寻,而无须理会这个字段是不是索引字段。
当然,当开发人员使用索引字段来查寻数据时,Locate会直接使用索引来帮助查寻,因此速度会非常快速。
如果开发人员使用非索引字段查寻数据,那么Locate也将使用目前它知道最好的方式来查寻数据。
此外,Locate方法不只能够查寻一个单一的字段,它同时还能以数个字段的条件来查寻数据。
开发人员可以组合数个字段的查寻条件在结果数据集中查寻数据。
由于Locate能够查寻各种不同数据类型的字段,因此Locate方法在设定查寻条件时是以Variant类型的变量来储存查寻数值的。
当开发人员要使用多个字段来查寻数据时必须建立一个Variant数组来储存查寻数值。
此外,Locate方法在查寻数据时也能够使用模糊条件标准来寻找特定的数据,例如开发人员可以要求Locate在查寻数据时不分大小写,或是以部分字符串来查寻数据,这样就为开发人员提供了非常大的弹性空间。
下面就是Locate的方法原型:function Locate(const KeyFields: String; const KeyValues: Variant;Options: TLocateOptions): Boolean;Locate方法接受三个参数。
第一个参数KeyFields是开发人员要查寻的字段名称。
如果开发人员要查寻单一字段,那么只需要直接传入此字段名称。
如果要以多个字段条件来查寻,那么便需传入所有的字段名称,并且以分号分隔每一个字段名称。
第二个参数KeyValues是指开发人员欲查寻的条件数值。
简易的A星算法自动寻路(C#)
简易的A星算法⾃动寻路(C#)路径计算⽅式(详见参考:堪称最好最全的A*算法详解(译⽂)):1. 曼哈顿距离,横向和纵向直线距离,仅限于横向纵向移动2. 对⾓线距离,对⾓线 + 直线,可以横向、纵向、对⾓线⽅向移动3. 欧⼏⾥得距离,任意⾓度直线,任意⽅向移动using System.Collections;using System.Collections.Generic;using UnityEngine;using System.Linq;public class AStartTest{AStarNode[,] nodeMap = new AStarNode[10, 10];void CheckAndFindPath(AStarNode startNode, AStarNode endNode){//计算路径List<AStarNode> pathNodes = FindNodePath(startNode, endNode, nodeMap);if (pathNodes == null || pathNodes.Count == 0)return;//计算路径折点List<AStarNode> pathPoints = GetPathPoint(pathNodes);}//计算路径折点List<AStarNode> GetPathPoint(List<AStarNode> path){List<AStarNode> tmpPointList = new List<AStarNode>();//⽆折点if (path.Count <= 2)return tmpPointList;//当前节点与前⼀节点的位置关系(X坐标相同或Y坐标相同)bool lastDirIsX = path[1].pos.x == path[0].pos.x;//计算折点for (int i = 2; i < path.Count; i++){//若与前⼀节点X坐标相同if (path[i].pos.x == path[i - 1].pos.x){//前两个节点时Y坐标相同,即为折点if (!lastDirIsX){//记录折点,记录当前节点关系tmpPointList.Add(path[i - 1]);lastDirIsX = true;}}else{if (lastDirIsX){tmpPointList.Add(path[i - 1]);lastDirIsX = false;}}}//路径最后节点也视为折点tmpPointList.Add(path[path.Count - 1]);//return tmpPointList;}#region --- A*算法 ---//计算最短有效路径List<AStarNode> openList = new List<AStarNode>();List<AStarNode> closeList = new List<AStarNode>();List<AStarNode> aroundNodes;List<AStarNode> FindNodePath(AStarNode startNode, AStarNode endNode, AStarNode[,] allNodes) {//计算范围内的节点openList.Clear();//不在计算范围内的节点closeList.Clear();//添加起点openList.Add(startNode);AStarNode curNode;//从起点开始循环判断while (openList.Count > 0){//初始当前位置curNode = openList[0];//计算最优当前位置for (int i = 0; i < openList.Count; i++){//F:从起点到⽬标点的移动步数//H:从当前位置到⽬标位置的移动步数if (openList[i].CostF < curNode.CostF && openList[i].costH < curNode.costH){curNode = openList[i];}}//锁定当前位置节点openList.Remove(curNode);closeList.Add(curNode);////已经计算到⽬标点//if (curNode.Equals(endNode))//{// //返回最优路径// return GetPathWithNode(startNode, endNode);// }//未计算到⽬标点, 继续//获取当前点的周围节点, 在周围节点中查找下⼀步的最优节点aroundNodes = GetAroundNodes(curNode, allNodes);for (int i = 0; i < aroundNodes.Count; i++){//计算到⽬标点if (aroundNodes[i].Equals(endNode)){//设置上⼀节点aroundNodes[i].lastNode = curNode;//返回最优路径return GetPathWithNode(startNode, endNode);}//不是⽬标点, 继续计算, 剔除周围节点不可通过、在不可计算范围内的节点if (!aroundNodes[i].isWall && !closeList.Contains(aroundNodes[i])){//计算 G H F//F:从起点到⽬标点的移动步数//G:从起点到当前位置的移动步数int newCostG = curNode.costG + GetNodesDistance(curNode, aroundNodes[i]);if (newCostG <= aroundNodes[i].costG || !openList.Contains(aroundNodes[i])){//刷新赋值aroundNodes[i].costG = newCostG;//H:从当前位置到⽬标位置的移动步数aroundNodes[i].costH = GetNodesDistance(aroundNodes[i], endNode);//设置上级节点aroundNodes[i].lastNode = curNode;//添加到计算范围内if (!openList.Contains(aroundNodes[i])){openList.Add(aroundNodes[i]);}}}}}return null;}//计算距离int GetNodesDistance(AStarNode startNode, AStarNode endNode){return Mathf.Abs(startNode.pos.x - endNode.pos.x) + Mathf.Abs(startNode.pos.y - endNode.pos.y);}//周围节点只取上下左右四个, 不取对⾓线(根据实际需求设置周围节点)Vector2Int[] aroundPos = { new Vector2Int(0, 1), new Vector2Int(0, -1), new Vector2Int(1, 0), new Vector2Int(-1, 0) }; //获取周围NodeList<AStarNode> tmpAroundList = new List<AStarNode>();List<AStarNode> GetAroundNodes(AStarNode curNode, AStarNode[,] allNodes){tmpAroundList.Clear();for (int i = 0; i < aroundPos.Length; i++){//计算周围节点坐标int x = curNode.pos.x + aroundPos[i].x;int y = curNode.pos.y + aroundPos[i].y;//剔除不在取值范围内的数据if (x >= 0 && x < allNodes.GetLength(0) && y >= 0 && y < allNodes.GetLength(1)){if (allNodes[x, y] != null)tmpAroundList.Add(allNodes[x, y]);}}return tmpAroundList;}//获取路径(包含起点)List<AStarNode> tmpNodePath = new List<AStarNode>();List<AStarNode> GetPathWithNode(AStarNode startNode, AStarNode endNode){tmpNodePath.Clear();if (endNode != null){//逆向查找路径AStarNode temp = endNode;while (temp != startNode){tmpNodePath.Add(temp);temp = stNode;}tmpNodePath.Add(startNode);//路径数据反向tmpNodePath.Reverse();}return tmpNodePath;}#endregion}public class AStarNode{//A*算法节点类//是否能通过public bool isWall;//位置坐标public Vector2Int pos;//上个节点public AStarNode lastNode;//从起点到当前位置的移动步数public int costG;//从当前位置到⽬标位置的移动步数public int costH;//从起点到⽬标点的移动步数public int CostF{get { return costG + costH; }}public AStarNode(bool _isWall, Vector2Int _pos) {isWall = _isWall;pos = _pos;}//重写Equalspublic override bool Equals(object obj){if (obj is AStarNode){AStarNode objNode = (AStarNode)obj;return objNode.pos == pos;}return false;}public override int GetHashCode(){return base.GetHashCode();}}。
delphi算法
delphi算法:DELPHI基本算法7.排序算法A.快速排序:procedure sort(l,r:eger);var i,j,mid:eger;begini:=l;j:=r; mid:=a[(l+r) div 2]; {将当前序列在中间位置数定义为中间数} [Page] repeatwhile a[i]< mid do inc(i); {在左半部分寻找比中间数大数}while mid< a[j] do dec(j);{在右半部分寻找比中间数小数}i< =j then begin {若找到组和排序目标不致数对则交换它们}swap(a[i],a[j]);inc(i);dec(j); {继续找}end;until i >j;l< j then sort(l,j); {若未到两个数边界则递归搜索左右区间}i< r then sort(i,r);end;{sort}B.插入排序:procedure insert_sort(k,m:word); {k为当前要插入数m为插入位置指针} var i:word; p:0..1;beginp:=0;for i:=m downto 1 dok=a[i] then exit;repeatIf k >a[m] then begina[m+1]:=k; p:=1;endbegina[m+1]:=a[m]; dec(m);end;until p=1;end;{insert_sort}l 主中为:a[0]:=0;for I:=1 to n do insert_sort(b[I],I-1);C.选择排序:procedure sort;var i,j,k:eger;beginfor i:=1 to n-1 do begink:=i;for j:=i+1 to n doa[j]< a[k] then k:=j; {找出a[I]..a[n]中最小数和a[I]作交换}k< >i then begina[0]:=a[k];a[k]:=a[i];a[i]:=a[0];end;end;end;D. 冒泡排序procedure sort;var i,j,k:eger;beginfor i:=n downto 1 dofor j:=1 to i-1 doa[j] >a[i] then begina[0]:=a[i];a[i]:=a[j];a[j]:=a[0];end;end;E.堆排序:procedure s t(i,m:eger);{调整以i为根子树成为堆,m为结点总数}var k:eger;begina[0]:=a[i]; k:=2*i;{在完全2叉树中结点i左孩子为2*i,右孩子为2*i+1} while k< =m do begin(k< m) and (a[k]< a[k+1]) then inc(k);{找出a[k]和a[k+1]中较大值}a[0]< a[k] then begin a[i]:=a[k];i:=k;k:=2*i; endk:=m+1;end;a[i]:=a[0]; {将根放在合适位置}end;procedure heapsort;varj:eger;beginfor j:=n div 2 downto 1 do s t(j,n);for j:=n downto 2 do beginswap(a[1],a[j]);s t(1,j-1);end;end;F. 归并排序{a为序列表tmp为辅助}procedure merge(var a:listtype; p,q,r:eger);{将已排序好子序列a[p..q]和a[q+1..r]合并为有序tmp[p..r]}var I,j,t:eger;tmp:listtype;begint:=p;i:=p;j:=q+1;{t为tmp指针I,j分别为左右子序列指针}while (t< =r) do begin(i< =q){左序列有剩余} and ((j >r) or (a[i]< =a[j])) {满足取左边序列当前元素要求} then begintmp[t]:=a[i]; inc(i);endbegintmp[t]:=a[j];inc(j);end;inc(t);end;for i:=p to r do a[i]:=tmp[i];end;{merge}procedure merge_sort(var a:listtype; p,r: eger); {合并排序a[p..r]}var q:eger;beginp< >r then beginq:=(p+r-1) div 2;merge_sort (a,p,q);merge_sort (a,q+1,r);merge (a,p,q,r);end;end;{}beginmerge_sort(a,1,n);end.G.基数排序思想:对每个元素按从低位到高位对每位进行次排序8.高精度计算A.B.C.D.9.树遍历顺序转换A. 已知前序中序求后序[Page]procedure Solve(pre,mid:);var i:eger;begin(pre=\'\') or (mid=\'\') then exit;i:=pos(pre[1],mid);solve(copy(pre,2,i),copy(mid,1,i-1));solve(copy(pre,i+1,length(pre)-i),copy(mid,i+1,length(mid)-i));post:=post+pre[1]; {加上根递归结束后post即为后序遍历}end;B.已知中序后序求前序procedure Solve(mid,post:);var i:eger;begin(mid=\'\') or (post=\'\') then exit;i:=pos(post[length(post)],mid);pre:=pre+post[length(post)]; {加上根递归结束后pre即为前序遍历} solve(copy(mid,1,I-1),copy(post,1,I-1));solve(copy(mid,I+1,length(mid)-I),copy(post,I,length(post)-i));end;C.已知前序后序求中序function ok(s1,s2:):boolean;var i,l:eger; p:boolean;beginok:=true;l:=length(s1);for i:=1 to l do beginp:=false;for j:=1 to l dos1[i]=s2[j] then p:=true;not p then begin ok:=false;exit;end;end;end;procedure solve(pre,post:);var i:eger;begin(pre=\'\') or (post=\'\') then exit;i:=0;repeatinc(i);until ok(copy(pre,2,i),copy(post,1,i));solve(copy(pre,2,i),copy(post,1,i));midstr:=midstr+pre[1];solve(copy(pre,i+2,length(pre)-i-1),copy(post,i+1,length(post)-i-1));end;10.求图弱连通子图(DFS)procedure dfs ( now,color: eger);beginfor i:=1 to n doa[now,i] and c[i]=0 then beginc[i]:=color;dfs(I,color);end;end;11.拓扑排序寻找数列其中任意连续p项的和为正任意q 项的和为负若不存在则输出NO.12.进制转换A.整数任意正整数进制间互化NOIP1996数制转换设串A$结构为: A$=\'mp\'其中m为数字串(长度< =20),而n,p均为1或2位数字串(其中所表达内容在2-10的间)要求:从键盘上读入A$后(不用正确性检查),将A$中数字串m(n进制)以p进制形式输出.例如:A$=\'48< 10 >8\'其意义为:将10进制数48,转换为8进制数输出.输出结果:48< 10 >=60< 8 >B.实数任意正整数进制间互化C.负数进制:NOIP2000设计个读入个十进制数基数和个负进制数基数并将此十进制数转换为此负进制下数:-R∈{-2-3-4, (20)13.全排列和组合生成排列生成:(1..n)procedure solve(dep:eger);vari:eger;begindep=n+1 then begin writeln(s);exit; end;for i:=1 to n donot used[i] then begins:=s+chr(i+ord(\'0\'));used[i]:=true;solve(dep+1);s:=copy(s,1,length(s)-1); used[i]:=false;end;end;组合生成(1..n中选取k个数所有方案)procedure solve(dep,pre:eger);vari:eger;begindep=k+1 then begin writeln(s);exit; end;for i:=1 to n do(not used[i]) and (i >pre) then begins:=s+chr(i+ord(\'0\'));used[i]:=true;solve(dep+1,i);s:=copy(s,1,length(s)-1); used[i]:=false;end;end;14 递推关系计算字串序号模型[Page]USACO1.2.5 StringSobits长度为N (N< =31)01串中1个数小于等于L串组成集合中找出按大小排序后第I 个01串数字划分模型*NOIP2001数划分将整数n分成k份且每份不能为空任意两种分法不能相同(不考虑顺序)for p:=1 to n dofor i:=p to n dofor j:=k downto 1 do inc(d[i,j],d[i-p,j-1]);writeln(d[n,k]);*变形1:考虑顺序d[ i, j] : = d [ i-k, j-1] (k=1..i)*变形2:若分解出来每个数均有个上限md[ i, j] : = d [ i-k, j-1] (k=1..m)15.算符优先法求解表达式求值问题const maxn=50;vars1:.gif' />[1..maxn] of eger; {s1为数字栈}s2:.gif' />[1..maxn] of char; {s2为算符栈}t1,t2:eger; {栈顶指针}procedure calcu;varx1,x2,x:eger;p:char;beginp:=s2[t2]; dec(t2);x2:=s1[t1]; dec(t1);x1:=s1[t1]; dec(t1);p of\'+\':x:=x1+x2;\'-\':x:=x1-x2;\'*\':x:=x1*x2;\'/\':x:=x1 div 2;end;inc(t1);s1[t1]:=x;end;procedure work;var c:char;v:eger;begint1:=0;t2:=0;while c< >\';\' doc of\'+\',\'-\': beginwhile (t2 >0) and (s2[t2]< >\'(\') do calcu;inc(t2);s2[t2]:=c;read©;end ;\'*\',\'/\':begin(t2 >0) and ((s2[t2]=\'*\') or (s2[t2]=\'/\')) then calcu; inc(t2);s2[t2]:=c;read©;end;\'(\':begin inc(t2); s2[t2]:=c; read©; end;\')\':beginwhile s2[t2]< >\'(\' do calcu;dec(t2); read©;end;\'0\'..\'9\':beginv:=0;repeatv:=10*v+ord©-ord(\'0\');read©;until (c< \'0\') or (c >\'9\');inc(t1); s1[t1]:=v;end;end;while t2 >0 do calcu;writeln(s1[t1]);end;16.查找算法折半查找function binsearch(k:keytype):eger;var low,hig,mid:eger;beginlow:=1;hig:=n;mid:=(low+hig) div 2;while (a[mid].key< >k) and (low< =hig) do begina[mid].key >k then hig:=mid-1low:=mid+1;mid:=(low+hig) div 2;end;low >hig then mid:=0;binsearch:=mid;end;树形查找2叉排序树:每个结点值都大于其左子树任结点值而小于其右子树任结点值查找function treesrh(k:keytype):po er;var q:po er;beginq:=root;while (q< >nil) and (q^.key< >k) dok< q^.key then q:=q^.leftq:=q^.right;treesrh:=q;end;17.KMP算法18.贪心*会议问题(1) n个活动每个活动有个开始时间和个结束时间任时刻仅项活动进行求满足活动数最多情况解:按每项活动结束时间进行排序排在前面优先满足(2)会议室空闲时间最少(3)每个客户有个愿付租金求最大利润(4)共R间会议室第i个客户需使用i间会议室费用相同求最大利润附录1 常用窍门技巧1.带权中位数我国蒙古大草原上有N(N是不大于100自然数)个牧民定居点P1(X1Y1)、P2(X2Y2)、…Pn(Xn Yn)相应地有关权重为Wi现在要求你在大草原上找点P(Xp Yp)使P点到任点Pi距离Di和Wi的积的和为最小[Page]即求D=W1*D1+W2*D2+…+Wi*Di+…+Wn*Dn 有最小值结论:对x和y两个方向分别求解带权中位数转化为维设最佳点p为点k则点k满足:令W为点k到其余各点带权距离的和则sigema( i=1 to k-1) Wi*Di < = W/2sigema( i=k+1 to n) Wi*Di < = W/2同时满足上述两式点k即为带权中位数2.求序列中连续子序列最大和beginmaxsum:=-maxlong;sum:=0;for i:=1 to n do begininc(sum,data[i]);sum >maxsum then maxsum:=sum;sum< 0 then sum:=0;end;writeln(maxsum);end;。
A星寻路算法
end
--[[
A Star 寻路主函数
]]
function AStarPathFind( aStartIndex, aEndIndex )
if ( aStartIndex < 0 and aStartIndex > Map.n ) then error( "StartIndex Out Off bound ") end
-- 判断是否是结束节点
if ( aIndex == aEndIndex ) then
ret = true
tmpNode.iParent = aMapNode
break
end
if ( leaseFNode == nil ) then break end
-- 从开放列表中移除该节点
openList:Remove( leaseFNode )
-- 添加到关闭列表
closeList:Add( leaseFNode )
-- 把该节点附近的节点添加到 开放列表
return ret
end
-- 增加一个Node到列表 --
function NodeList:AddNode( aMapNode )
if ( self.iRoot == nil )then
self.iRoot = aMapNode
return
end
setmetatable(ret, self)
ret.iX = aIndex - math.floor( aIndex / KMapWidth) * KMapWidth -- 求余、未知 % 为什么报错,数学库也打开了
A※算法
启发函数H(N)在A*算法中的作用最为重要,它不是一个固定的算法,不同的问题,其启发函数也一般不同。
对于一个正确的A*算法,必须满足:
1、H(N)小于结点N到目标结点T的实际代价,即(H(N)<=H*(N))。
2、任意节点N的扩展结点M,必定满足F(M)>=F(N)。
A*
对于A*算法,很明显每次扩展结点都应当选择F值尽可能小的待扩展结点进行搜索。可以看出,待扩展结点的变化是动态的,对某个节点扩展之后,此节点不再是待扩展结点,并且会得到新的待扩展结点。因此我们可以用堆进行实现。
}p[37000];
struct X tmp,d;
//总状态数为9!=362880
int h[370000]={0},g[370000]={0};
//判重+记录到某种状态的H(N),G(N)
int all=0,now[9]={0},end[9]={0};
//分别记录待扩展节点数,当前状态,目标状态
bool in_[370000]={0};//表示某个结点是否在堆内
{
int i=0,num=0;
for(i=0;i<9;++i)
if(s[i]!=end[i])
++num;
return num;
}
void init()
{
int i=0;
char a=0;
memset(g,-1,sizeof(g));
memset(h,-1,sizeof(h));
for(i=0;i<9;++i)
all=1;
}
void mtd(int x) //维护堆
{
delphi函数详解
名称类型说明Delphi中常用的函数A部Abort 函数引起放弃的意外处理Abs 函数绝对值函数AddExitProc 函数将一过程添加到运行时库的结束过程表中Addr 函数返回指定对象的地址AdjustLineBreaks 函数将给定字符串的行分隔符调整为CR/LF序列Align 属性使控件位于窗口某部分Alignment 属性控件标签的文字位置AllocMem 函数在堆栈上分配给定大小的块AllowGrayed 属性允许一个灰度选择AnsiCompareStr 函数比较字符串(区分大小写)AnsiCompareText 函数比较字符串(不区分大小写)AnsiLowerCase 函数将字符转换为小写AnsiUpperCase 函数将字符转换为大写Append 函数以附加的方式打开已有的文件ArcTan 函数余切函数AssignFile 函数给文件变量赋一外部文件名Assigned 函数测试函数或过程变量是否为空AutoSize 属性自动控制标签的大小B部BackgroundColor 属性背景色BevelInner 属性控件方框的内框方式BevelOuter 属性控件方框的外框方式BevelWidth 属性控件方框的外框宽度BlockRead 函数读一个或多个记录到变量中BlockWrite 函数从变量中写一个或多个记录BorderStyle 属性边界类型BorderWidth 属性边界宽度Break 命令终止for、while、repeat循环语句Brush 属性画刷C部Caption 属性标签文字的内容ChangeFileExt 函数改变文件的后缀ChDir 函数改变当前目录Checked 属性确定复选框选中状态Chr 函数返回指定序数的字符CloseFile 命令关闭打开的文件Color 属性标签的颜色Columns 属性显示的列数CompareStr 函数比较字符串(区分大小写)Concat 函数合并字符串Continue 命令继续for、while、repeat的下一个循环Copy 函数返回一字符串的子串Cos 函数余弦函数Ctl3D 属性是否具有3D效果Cursor 属性鼠标指针移入后的形状D部Date 函数返回当前的日期DateTimeToFileDate 函数将DELPHI的日期格式转换为DOS的日期格式DateTimeToStr 函数将日期时间格式转换为字符串DateTimeToString 函数将日期时间格式转换为字符串DateToStr 函数将日期格式转换为字符串DayOfWeek 函数返回星期的数值Dec 函数递减变量值DecodeDate 函数将日期格式分解为年月日DecodeTime 函数将时间格式分解为时、分、秒、毫秒Delete 函数从字符串中删除子串DeleteFile 命令删除文件DiskFree 函数返回剩余磁盘空间的大小DiskSize 函数返回指定磁盘的容量Dispose 函数释放动态变量所占的空间DisposeStr 函数释放字符串在堆栈中的内存空间DitherBackground 属性使背景色的色彩加重或减少50% DragCursor 属性当鼠标按下时光标的形状DragMode 属性按动的作用方式DropDownCount 属性容许的显示数据项的数目E部EditMask 属性编辑模式Enabled 属性是否使标签呈现打开状态EncodeDate 函数将年月日合成为日期格式EncodeTime 函数将时、分、秒、毫秒合成为时间格式EndMargin 属性末尾边缘Eof 函数对有类型或无类型文件测试是否到文件尾Eoln 函数返回文本文件的行结束状态Erase 命令删除外部文件ExceptAddr 函数返回引起当前意外的地址Exclude 函数从集合中删除一些元素ExceptObject 函数返回当前意外的索引Exit 命令立即从当前的语句块中退出Exp 函数指数函数ExpandFileName 函数返回包含绝对路径的字符串ExtendedSelect 属性是否允许存在选择模式,True时,MultiSelect才有意义ExtractFileDir 函数返回驱动器和路径ExtractFileExt 函数返回文件的后缀ExtractFileName 函数返回文件名ExtractFilePath 函数返回指定文件的路径F部FileAge 函数返回文件已存在的时间FileClose 命令关闭指定的文件FileCreate 命令用指定的文件名建立新文件FileDateToDateTime 函数将DOS的日期格式转换为DELPHI的日期格式FileExists 函数检查文件是否存在FileGatAttr 函数返回文件的属性FileGetDate 函数返回文件的DOS日期时间标记FileOpen 命令用指定的存取模式打开指定的文件FilePos 函数返回文件的当前指针位置FileRead 命令从指定的文件读取FileSearch 命令在目录中搜索指定的文件FileSeek 函数改变文件的指针FileSetAttr 函数设置文件属性FileSetDate 函数设置文件的DOS日期时间标记FileSize 函数返回当前文件的大小FileWrite 函数对指定的文件做写操作FillChar 函数用指定的值填充连续字节的数FindClose 命令终止FindFirst/FindNext序列FindFirst 命令对指定的文件名及属性搜索目录FindNext 命令返回与文件名及属性匹配的下一入口FloatToDecimal 函数将浮点数转换为十进制数FloatToStrF 函数将浮点数转换为字符串FloatToStr 函数将浮点数转换为字符串FloatToText 函数将给定的浮点数转换为十进制数FloatToTextFmt 函数将给定的浮点数转换为十进制数Flush 函数将缓冲区的内容刷新到输出的文本文件中FmtLoadStr 函数从程序的资源字符串表中装载字符串FmtStr 函数格式化一系列的参数,其结果以参数Result返回Font 属性设置字体Format 函数格式化一系列的参数并返回Pascal字符串FormatBuf 函数格式化一系列的参数FormatDateTime 函数用指定的格式来格式化日期和时间FormatFloat 函数指定浮点数格式Frac 函数返回参数的小数部分FreeMem 函数按给定大小释放动态变量所占的空间G部GetDir 函数返回指定驱动器的当前目录GetHeapStatus 函数返回内存管理器的当前状态GetMem 函数建立一指定大小的动态变量,并将指针指向该处GetMemoryManager 函数返回内存管理器的入口点Glyph 属性按钮上的图象H部Halt 命令停止程序的执行并返回到操作系统Hi 函数返回参数的高地址位High 函数返回参数的上限值Hint 属性提示信息I部Int 函数返回参数的整数部分Include 函数添加元素到集合中Insert 函数在字符串中插入子串IntToHex 函数将整型数转换为十六进制数IntToStr 函数将整型数转换为字符串IOResult 函数返回最新的I/O操作完成状态IsValidIdent 函数测试字符串是否为有效的标识符Items 属性默认显示的节点K部Kind 属性摆放样式L部LargeChange 属性最大改变值Layout 属性图象布局Length 函数返回字符串的动态长度Lines 属性缺省显示内容Ln 函数自然对数函数Lo 函数返回参数的低地址位LoadStr 函数从应用程序的可执行文件中装载字符资源LowerCase 函数将给定的字符串变为小写Low 函数返回参数的下限值M部Max 属性最大值MaxLength 属性最大长度Min 属性最小值MkDir 命令建立一子目录Move 函数从源到目标复制字节MultiSelect 属性允许同时选择几个数据项N部Name 属性控件的名字New 函数建立新的动态变量并设置一指针变量指向他NewStr 函数在堆栈上分配新的字符串Now 函数返回当前的日期和时间O部Odd 函数测试参数是否为奇数OnActivate 事件焦点移到窗体上时触发OnClick 事件单击窗体或组件触发OnDblClick 事件双击窗体或组件触发OnCloseQuery 事件使用者试图关闭窗体触发OnClose 事件窗体关闭后才触发OnCreate 事件窗体第一次创建时触发OnDragDrop 事件鼠标拖放操作结束时触发OnDragOver 事件有其他控件从他上面移过触发OnMouseDown 事件按下鼠标键时触发OnMouseUp 事件释放鼠标键时触发OnMouseMove 事件移动鼠标时触发OnHide 事件隐藏窗体时触发OnKeyDown 事件按下键盘某键时触发OnKeyPress 事件按下键盘上的单个字符键时触发OnKeyUp 事件释放键盘上的某键时触发OnPaint 事件窗体上有新部分暴露出来触发OnResize 事件重新调整窗体大小触发OnShow 事件在窗体实际显示之前瞬间触发Ord 函数返回序数类的序数OutlineStyle 属性类型OutOfMemoryError 命令引起OutOfMemory意外P部PageIndex 属性页索引Pages 属性页ParamCount 函数返回在命令行上传递给程序的参数数量ParamStr 函数返回指定的命令行参数Pen 属性画刷设置Pi 函数返回圆周率PiPicture 属性显示图象PictureClosed 属性设置Closed位图PictureLeaf 属性设置Leaf位图PictureMinus 属性设置Minus位图PictureOpen 属性设置Open位图PicturePlus 属性设置Plus位图Pos 函数在字符串中搜索子串Pred 函数返回先前的参数R部Random 函数返回一随机函数Randomize 函数用一随机数初始化内置的随机数生成器Read 函数对有格式的文件,读一文件组件到变量中;文本文件,读一个或多个值到一个或多个变量中Readln 函数执行Read过程,然后跳到文件下一行ReadOnly 属性只读属性ReAllocMem 函数分配一动态变量Rename 函数重命名外部文件RenameFile 函数对文件重命名Reset 函数打开已有的文件Rewrite 函数建立并打开一新的文件RmDir 函数删除空的子目录Round 函数将实数值舍入为整型值RunError 函数停止程序的执行S部ScrollBars 属性滚动条状态Seek 函数将文件的当前指针移动到指定的组件上SeekEof 函数返回文件的文件结束状态SeekEoln 函数返回文件的行结束状态SelectedColor 属性选中颜色SetMemoryManager 函数设置内存管理器的入口点SetTextBuf 函数给文本文件指定I/O缓冲区Shape 属性显示的形状ShowException 函数显示意外消息与地址Sin 函数正弦函数SizeOf 函数返回参数所占的字节数SmallChange 属性最小改变值Sorted 属性是否允许排序Sqr 函数平方函数Sqrt 函数平方根函数StartMargin 属性开始边缘State 属性控件当前状态Str 函数将数值转换为字符串StrAlloc 函数给以NULL结束的字符串分配最大长度-1的缓冲区StrBufSize 函数返回存储在由StrAlloc分配的字符缓冲区的最大字符数StrCat 函数将一字符串附加到另一字符串尾并返回合并的字符串StrComp 函数比较两个字符串StrCopy 函数将一个字符串复制到另一个字符串中StrDispose 函数释放堆栈上的字符串StrECopy 函数将一字符串复制到另一个字符串并返回结果字符串尾部的指针StrEnd 函数返回指向字符串尾部的指针Stretch 属性自动适应控件的大小StrFmt 函数格式化一系列的参数StrIComp 函数比较两个字符串(不区分大小写)StringToWideChar 函数将ANSI字符串转换为UNICODE字符串StrLCat 函数将一字符串中的字符附加到另一字符串尾并返回合并的字符串StrLComp 函数以最大长度比较两个字符串StrLCopy 函数将一个字符串中的字符复制到另一个字符串中StrLen 函数返回字符串中的字符数StrLFmt 函数格式化一系列的参数,其结果中包含有指向目标缓冲区的指针StrLIComp 函数以最大长度比较两个字符串(不区分大小写)StrLower 函数将字符串中的字符转换为小写StrMove 函数将一个字符串中的字符复制到另一个字符串中StrNew 函数在堆栈上分配一个字符串StrPas 函数将以NULL结束的字符串转换为PASCAL类的字符串StrPCopy 函数将PASCAL类的字符串复制为以NULL结束的字符串StrPLCopy 函数从PASCAL类的最大长度字符串复制为以NULL结束的字符串StrPos 函数返回一个字符串在另一个字符串中首次出现指针StrRScan 函数返回字符串中最后出现字符的指针StrScan 函数返回字符串中出现首字符的指针StrToDate 函数将字符串转换为日期格式StrToDateTime 函数将字符串转换为日期/时间格式StrToFloat 函数将给定的字符串转换为浮点数StrToInt 函数将字符串转换为整型StrToIntDef 函数将字符串转换为整型或默认值StrToTime 函数将字符串转换为时间格式StrUpper 函数将字符串中的字符转换为大写Style 属性类型选择Suce 函数返回后继的参数Swap 函数交换参数的高低地址位T部Tabs 属性标记每一项的内容TabIndex 属性标记索引Text 属性显示的文本TextToFloat 函数将字符串(以NULL结束的格式)转换为浮点数Time 函数返回当前的时间TimeToStr 函数将时间格式转换为字符串Trim 函数从给定的字符串中删除前导和尾部的空格及控制字符TrimLeft 函数从给定的字符串中删除首部的空格及控制字符TrimRight 函数从给定的字符串中删除尾部的空格及控制字符Trunc 函数将实型值截取为整型值Truncate 函数截去当前文件位置后的内容U部UnSelectedColor 属性未选中颜色UpCase 函数将字符转换为大写UpperCase 函数将给定的字符串变为大写V部Val 函数将字符串转换为整型值VarArrayCreate 函数以给定的界限和维数建立变体数组VarArrayDimCount 函数返回给定变体的维数VarArrayHighBound 函数返回给定变体数组维数的上界VarArrayLock 函数锁定给定的变体数组VarArrayLowBound 函数返回给定变体数组维数的下界VarArrayOf 函数返回指定变体的数组元素VarArrayRedim 函数通过改变上限来调整变体的大小VarArrayUnlock 函数解锁指定的变体数组VarAsType 函数将变体转换为指定的类型VarCase 函数将变体转换为指定的类型并保存他VarClear 函数清除指定的变体VarCopy 函数将指定的变体复制为指定的变体VarFormDateTime 函数返回包含日期时间的变体VarIsArray 函数测试变体是否为数组VarIsEmpty 函数测试变体是否为UNASSIGNED VarIsNull 函数测试变体是否为NULL VarToDateTime 函数将给定的变体转换为日期时间VarType 函数将变体转换为指定的类型并保存他Visible 属性控件的可见性W部WantReturns 属性为True时,按回车键产生一个回车符;为False时,按下Ctrl+Enter才产生回车符Write 命令对有格式的文件,写一变量到文件组件中;对文本文件,写一个或多个值到文件中Writeln 命令执行WRITE过程,然后输出一行结束标志WideCharLenToString 函数将ANSI字符串转换为UNICODE字符串WideCharLenToStrWar 函数将UNICODE字符串转换为ANSI字符串变量WideCharToString 函数将UNICODE字符串转换为ANSI字符串WideCharToStrVar 函数将UNICODE字符串转换为ANSI字符串变量delphi函数大全之ABC篇-详解(2007-04-09 00:25:46)标签:delphi函数━━━━━━━━━━━━━━━━━━━━━首部 function CompareStr(const S1, S2: string): Integer; $[SysUtils.pas功能 返回比较两个字符说明 当S1>S2返回值>0;当S1<S2返回值<0;当S1=S2返回值=0;区分大小写参考 <NULL>例子 SpinEdit1.Value := CompareStr(Edit1.Text, Edit2.Text);━━━━━━━━━━━━━━━━━━━━━首部 function CompareMem(P1, P2: Pointer; Length: Integer): Boolean; assembler; $[SysUtils.pas功能 返回比较两个内存指针说明 CompareMem(PChar('12a'), PChar('12c'), 2)=True;CompareMem(PChar('12a'), PCha r('12c'), 3)=False参考 <NULL>例子 CheckBox1.Checked := CompareMem(Self, Form1, 8);━━━━━━━━━━━━━━━━━━━━━首部 function CompareText(const S1, S2: string): Integer; $[SysUtils.pas功能 返回比较两个字符串说明 不区分大小写参考 <NULL>例子 SpinEdit1.Value := CompareText(Edit1.Text, Edit2.Text);━━━━━━━━━━━━━━━━━━━━━首部 function AnsiUpperCase(const S: string): string; $[SysUtils.pas功能 返回字符串S的大写形式说明 ANSI(American National Standards Institute)美国国家标准协会;非小写的字符不变参考 function Windows.CharUpperBuff例子 Edit2.Text := AnsiUpperCase(Edit1.Text);━━━━━━━━━━━━━━━━━━━━━首部 function AnsiLowerCase(const S: string): string; $[SysUtils.pas功能 返回字符串S的小写形式说明 非大写字符不处理参考 function Windows.CharLowerBuff例子 Edit2.Text := AnsiLowerCase(Edit1.Text);━━━━━━━━━━━━━━━━━━━━━首部 function AnsiCompareStr(const S1, S2: string): Integer; $[SysUtils.pas功能 反回比较两个字符串说明 当S1>S2返回值>0;当S1<S2返回值<0;当S1=S2返回值=0;区分大小写参考 function pareString例子 SpinEdit1.Value := AnsiCompareStr(Edit1.Text, Edit2.Text);━━━━━━━━━━━━━━━━━━━━━首部 function AnsiSameStr(const S1, S2: string): Boolean; $[SysUtils.pas功能 返回两个字符串是否相等说明 区分大小写参考 function SysUtils.AnsiCompareStr例子 CheckBox1.Checked := AnsiSameStr(Edit1.Text, Edit2.Text);━━━━━━━━━━━━━━━━━━━━━首部 function AnsiCompareText(const S1, S2: string): Integer; $[SysUtils.pas 功能 反回比较两个字符串说明 当S1>S2返回值>0;当S1<S2返回值<0;当S1=S2返回值=0;不区分大小写参考 function pareString例子 SpinEdit1.Value := AnsiCompareText(Edit1.Text, Edit2.Text);首部 function AnsiSameText(const S1, S2: string): Boolean; $[SysUtils.pas功能 返回两个字符串是否相等说明 不区分大小写参考 function SysUtils.AnsiCompareText例子 CheckBox1.Checked := AnsiSameText(Edit1.Text, Edit2.Text);━━━━━━━━━━━━━━━━━━━━━首部 function AnsiStrComp(S1, S2: PChar): Integer; $[SysUtils.pas功能 返回比较两个指针字符串说明 当S1>S2返回值>0;当S1<S2返回值<0;当S1=S2返回值=0;区分大小写参考 function pareString例子 SpinEdit1.Value := AnsiStrComp(PChar(Edit1.Text), PChar(Edit2.Text))━━━━━━━━━━━━━━━━━━━━━首部 function AnsiStrIComp(S1, S2: PChar): Integer; $[SysUtils.pas功能 返回比较两个指针字符串说明 当S1>S2返回值>0;当S1<S2返回值<0;当S1=S2返回值=0;不区分大小写;Ignore(忽略) 参考 function pareString例子 SpinEdit1.Value := AnsiStrIComp(PChar(Edit1.Text), PChar(Edit2.Text))━━━━━━━━━━━━━━━━━━━━━首部 function AnsiStrLComp(S1, S2: PChar; MaxLen: Cardinal): Integer; $[SysUtils. pas功能 返回比较两个指针字符串指定长度说明 当S1>S2返回值>0;当S1<S2返回值<0;当S1=S2返回值=0;区分大小写;Length(长度) 参考 function pareString例子 SpinEdit1.Value := AnsiStrLComp(PChar(Edit1.Text), PChar(Edit2.Text), SpinEdit2.Value)━━━━━━━━━━━━━━━━━━━━━首部 function AnsiStrLIComp(S1, S2: PChar; MaxLen: Cardinal): Integer; $[SysUtils .pas功能 返回比较两个指针字符串指定长度说明 当S1>S2返回值>0;当S1<S2返回值<0;当S1=S2返回值=0;不区分大小写参考 function pareString例子 SpinEdit1.Value := AnsiStrLIComp(PChar(Edit1.Text), PChar(Edit2.Text), SpinE dit2.Value)━━━━━━━━━━━━━━━━━━━━━首部 function AnsiStrLower(Str: PChar): PChar; $[SysUtils.pas功能 返回指针字符串小写形式说明 非大写字符不处理参考 function Windows.CharLower例子 Edit2.Text := AnsiStrLower(PChar(Edit1.Text));首部 function AnsiStrUpper(Str: PChar): PChar; $[SysUtils.pas功能 返回指针字符串大写形式说明 非小写字符不处理参考 function Windows.CharUpper例子 Edit2.Text := AnsiStrUpper(PChar(Edit1.Text));━━━━━━━━━━━━━━━━━━━━━首部 function AnsiLastChar(const S: string): PChar; $[SysUtils.pas功能 返回字符串S的最后一个指针字符说明 当字符串S为空串则返回空指针参考 function SysUtils.ByteType例子 Edit2.Text := AnsiLastChar(Edit1.Text);━━━━━━━━━━━━━━━━━━━━━首部 function AnsiStrLastChar(P: PChar): PChar; $[SysUtils.pas功能 返回指针字符串P的最后一个指针字符说明 当字符串P为空空指针则返回空指针参考 function SysUtils.ByteType例子 Edit2.Text := AnsiLastChar(PChar(Edit1.Text));━━━━━━━━━━━━━━━━━━━━━首部 function AnsiQuotedStr(const S: string; Quote: Char): string; $[SysUtils.pas 功能 返回字符串S以字符Quote为引号的表现形式说明 AnsiQuotedStr('hello"world', '@')='@hello"world@';AnsiQuotedStr('hello"world ', '"')='"hello""world"'参考 function SysUtils.AnsiStrScan例子 Edit2.Text := AnsiQuotedStr(Edit1.Text, '"');━━━━━━━━━━━━━━━━━━━━━首部 function AnsiExtractQuotedStr(var Src: PChar; Quote: Char): string; $[SysUti ls.pas功能 返回以字符Quote为引号的表现形式原形说明 表现形式非法时Src不变否则为空参考 function SysUtils.AnsiStrScan例子///////Begin AnsiExtractQuotedStrprocedure TForm1.Button1Click(Sender: TObject);varP: PChar;beginP := PChar(Edit1.Text);Edit2.Text := AnsiExtractQuotedStr(P, '"');Edit3.Text := P;end;///////End AnsiExtractQuotedStr━━━━━━━━━━━━━━━━━━━━━首部 function AnsiDequotedStr(const S: string; AQuote: Char): string; $[SysUtils. pas功能 返回以字符AQuote为引号的表现形式原形说明 表现形式非法时则返回S参考 function SysUtils.AnsiExtractQuotedStr例子 Edit2.Text := AnsiDequotedStr(Edit1.Text, '"');━━━━━━━━━━━━━━━━━━━━━首部 function AdjustLineBreaks(const S: string; Style: TTextLineBreakStyle = {$IF DEF LINUX} tlbsLF {$ENDIF} {$IFDEF MSWINDOWS} tlbsCRLF {$ENDIF}): string; $[Sys Utils.pas功能 返回将给定字符串的行分隔符调整为CR/LF序列说明 AdjustLineBreaks('1'#13'2'#13)='1'#13#10'2'#13#10;AdjustLineBreaks('1'#10'2' #10)='1'#13#10'2'#13#10参考 function SysUtils.StrNextChar例子 <NULL>━━━━━━━━━━━━━━━━━━━━━首部 function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string; $[SysU tils.pas功能 返回逻辑值B转换成字符串说明 BoolToStr(False, False)='0';BoolToStr(False, True)='-1'参考 var SysUtils.TrueBoolStrs;var SysUtils.FalseBoolStrs例子 Edit1.Text := BoolToStr(CheckBox1.Checked, CheckBox2.Checked);━━━━━━━━━━━━━━━━━━━━━首部 function ChangeFileExt(const FileName, Extension: string): string; $[SysUtil s.pas功能 返回改变扩展名后的文件名说明 [注意]扩展名Extension前要加点;ChangeFileExt('a.jpg', 'bmp')='abmp'参考 function stDelimiter;function System.Copy例子 Edit1.Text := ChangeFileExt(Edit2.Text, Edit3.Text);━━━━━━━━━━━━━━━━━━━━━首部 function CreateDir(const Dir: string): Boolean; $[SysUtils.pas功能 返回创建目录是否成功说明 不支持多级目录;已经存在则返回False参考 function Windows.CreateDirectory例子 CheckBox1.Checked := CreateDir(Edit1.Text);━━━━━━━━━━━━━━━━━━━━━首部 function CurrToStrF(Value: Currency; Format: TFloatFormat; Digits: Integer): string; $[SysUtils.pas功能 返回货币类型以指定格式转换成字符串说明 Digits指定小数宽度参考 function SysUtils.FloatToText例子///////Begin CurrToStrFprocedure TForm1.Button1Click(Sender: TObject);beginMemo1.Lines.Values['ffGeneral'] := CurrToStrF(StrToCurrDef(Edit1.Text, 0), ffGeneral, SpinEdit1.Value);Memo1.Lines.Values['ffExponent'] := CurrToStrF(StrToCurrDef(Edit1.Text, 0), ffExponent, SpinEdit1.Value);Memo1.Lines.Values['ffFixed'] := CurrToStrF(StrToCurrDef(Edit1.Text, 0), ffFixed, SpinEdit1.Value);Memo1.Lines.Values['ffNumber'] := CurrToStrF(StrToCurrDef(Edit1.Text, 0), ffNumber, SpinEdit1.Value);Memo1.Lines.Values['ffCurrency'] := CurrToStrF(StrToCurrDef(Edit1.Text, 0), ffCurrency, SpinEdit1.Value);end;///////End CurrToStrF━━━━━━━━━━━━━━━━━━━━━首部 function CurrentYear: Word; $[SysUtils.pas功能 返回当前年份说明 <NULL>参考 function Windows.GetLocalTime例子 SpinEdit1.Value := CurrentYear;delphi函数大全之D-G篇-详解(2007-04-09 00:27:56)标签:delphi函数━━━━━━━━━━━━━━━━━━━━━首部 function ExpandFileNameCase(const FileName: string; out MatchFound: TFilenam eCaseMatch): string; $[SysUtils.pas功能 分情况返回文件名的完整表示说明 type TFilenameCaseMatch = (mkNone, mkExactMatch, mkSingleMatch, mkAmbiguous); 参考 function Windows.GetFullPathName;function SysUtils.SameFileName;function SysUtils.FindFirst例子///////Begin ExpandFileNameCaseprocedure TForm1.Button1Click(Sender: TObject);varvFilenameCaseMatch: TFilenameCaseMatch;beginEdit1.Text := ExpandFileNameCase(Edit2.Text, vFilenameCaseMatch);SpinEdit1.Value := Ord(vFilenameCaseMatch);end;///////End ExpandFileNameCase━━━━━━━━━━━━━━━━━━━━━首部 function ExpandUNCFileName(const FileName: string): string; $[SysUtils.pas 功能 返回LINUX文件名的完整表示说明 ExpandUNCFileName('C:/')='C:\'参考 function SysUtils.ExpandFileName例子 Edit1.Text := ExpandUNCFileName(Edit2.Text);━━━━━━━━━━━━━━━━━━━━━首部 function ExtractRelativePath(const BaseName, DestName: string): string; $[Sy sUtils.pas功能 返回参数的相对路径说明 ExtractRelativePath('C:\Windows\', 'C:\Windows\System')='System'参考 function SysUtils.SameFilename;function SysUtils.ExtractFileDrive例子 Edit1.Text := ExtractRelativePath(Edit2.Text, Edit3.Text);━━━━━━━━━━━━━━━━━━━━━首部 function ExtractShortPathName(const FileName: string): string; $[SysUtils.pa s功能 返回参数的DOS路径说明 ExtractShortPathName('C:\Program Files\Borland')='C:\PROGRA~1\BORLAND'参考 function Windows.GetShortPathName例子 Edit1.Text := ExtractShortPathName(Edit2.Text);━━━━━━━━━━━━━━━━━━━━━首部 function FileSearch(const Name, DirList: string): string; $[SysUtils.pas 功能 返回目录列表中DirList搜索的第一个结果说明 FileSearch('Calc.exe', 'd:\winxp\system32;c:\windows')='d:\winxp\system32\ca lc.exe'参考 function SysUtils.FileExists;function SysUtils.AnsiLastChar例子 Edit1.Text := FileSearch(Edit2.Text, Edit3.Text);━━━━━━━━━━━━━━━━━━━━━首部 function DiskFree(Drive: Byte): Int64; $[SysUtils.pas功能 返回驱动器可用空间说明 参数Drive为0表示当前路径,为1表示=A驱,为2表示=B驱...;获取失败则返回-1 参考 function Windows.GetDiskFreeSpaceExA例子 SpinEdit1.Value := DiskFree(SpinEdit2.Value);━━━━━━━━━━━━━━━━━━━━━首部 function DiskSize(Drive: Byte): Int64; $[SysUtils.pas功能 返回驱动器全部空间说明 参数Drive为0表示当前路径,为1表示=A驱,为2表示=B驱...;获取失败则返回-1 参考 function Windows.GetDiskFreeSpaceExA例子 SpinEdit1.Value := DiskSize(SpinEdit2.Value);━━━━━━━━━━━━━━━━━━━━━首部 function FileDateToDateTime(FileDate: Integer): TDateTime; $[SysUtils.pas 功能 返回将文件日期时间类型转换日期时间类型说明 FileDate非法是将触发异常参考 function SysUtils.EncodeDate;function SysUtils.EncodeTime例子 <参见FileAge>━━━━━━━━━━━━━━━━━━━━━首部 function DateTimeToFileDate(DateTime: TDateTime): Integer; $[SysUtils.pas 功能 返回将日期时间类型转换文件日期时间类型说明 年份在1980到2107之外则返回0参考 function SysUtils.DecodeDate;function SysUtils.DecodeTime例子 <参见FileSetDate>━━━━━━━━━━━━━━━━━━━━━首部 function GetCurrentDir: string; $[SysUtils.pas功能 返回当前操作目录说明 [注意]调用文件对话框会改变当前操作目录参考 function System.GetDir例子 Edit1.Text := GetCurrentDir;━━━━━━━━━━━━━━━━━━━━━首部 function Format(const Format: string; const Args: array of const): string; $ [SysUtils.pas功能 返回按指定方式格式化一个数组常量的字符形式说明 这个函数是我在Delphi中用得最多的函数,现在就列举几个例子给你个直观的理解 "%" [索引 ":"] ["-"] [宽度] ["." 摘要] 类型Format('x=%d', [12]); //'x=12' //最普通Format('x=%3d', [12]); //'x= 12' //指定宽度Format('x=%f', [12.0]); //'x=12.00' //浮点数Format('x=%.3f', [12.0]); //'x=12.000' //指定小数Format('x=%.*f', [5, 12.0]); //'x=12.00000' //动态配置Format('x=%.5d', [12]); //'x=00012' //前面补充0Format('x=%.5x', [12]); //'x=0000C' //十六进制Format('x=%1:d%0:d', [12, 13]); //'x=1312' //使用索引Format('x=%p', [nil]); //'x=00000000' //指针Format('x=%1.1e', [12.0]); //'x=1.2E+001' //科学记数法Format('x=%%', []); //'x=%' //得到"%"S := Format('%s%d', [S, I]); //S := S + StrToInt(I); //连接字符串参考 proceduer SysUtils.FmtStr例子 Edit1.Text := Format(Edit2.Text, [StrToFloatDef(Edit.3.Text, 0)]);━━━━━━━━━━━━━━━━━━━━━首部 procedure FmtStr(var Result: string; const Format: string; const Args: array of const); $[SysUtils.pas功能 按指定方式格式化一个数组常量的字符形式返回说明 <参见Format>参考 function SysUtils.FormatBuf;function System.Length;function System.SetLength 例子 <参见Format>━━━━━━━━━━━━━━━━━━━━━首部 function FormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardi nal; const Args: array of const): Cardinal; $[SysUtils.pas功能 返回按指定方式格式化一个数组常量到缓冲区Buffer中说明 <NULL>参考 <NULL>例子 <参见Format>━━━━━━━━━━━━━━━━━━━━━首部 function FloatToStr(Value: Extended): string; $[SysUtils.pas功能 返回浮点数Value转换成字符串说明 当浮点数大等于1E15将采用科学记数法参考 function SysUtils.FloatToText例子 Edit1.Text := FloatToStr(Now);━━━━━━━━━━━━━━━━━━━━━首部 function CurrToStr(Value: Currency): string; $[SysUtils.pas功能 返回货币数Value转换成字符串说明 货币数只保留四位小数参考 function SysUtils.FloatToText例子 Edit1.Text := CurrToStr(Now);━━━━━━━━━━━━━━━━━━━━━首部 function FloatToCurr(const Value: Extended): Currency; $[SysUtils.pas功能 返回浮点数Value转换成货币数说明 如果浮点数Value超出范围则将触发异常参考 const SysUtiles.MinCurrency;const SysUtiles.MaxCurrency例子 Edit1.Text := CurrToStr(FloatToCurr(Now));━━━━━━━━━━━━━━━━━━━━━首部 function FloatToStrF(Value: Extended; Format: TFloatFormat; Precision, Digit s: Integer): string; $[SysUtils.pas功能 返回浮点数以指定格式转换成字符串说明 Precision指定精度;Digits指定小数宽度参考 function SysUtils.FloatToText例子///////Begin FloatToStrFprocedure TForm1.Button1Click(Sender: TObject);beginMemo1.Lines.Values['ffGeneral'] := FloatToStrF(StrToFloatDef(Edit1.Text, 0), ffGeneral, SpinEdit1.Value, SpinEdit2.Value);Memo1.Lines.Values['ffExponent'] := FloatToStrF(StrToFloatDef(Edit1.Text, 0), ffExponent, SpinEdit1.Value, SpinEdit2.Value);Memo1.Lines.Values['ffFixed'] := FloatToStrF(StrToFloatDef(Edit1.Text, 0), ffFixed, SpinEdit1.Value, SpinEdit2.Value);Memo1.Lines.Values['ffNumber'] := FloatToStrF(StrToFloatDef(Edit1.Text, 0), ffNumber, SpinEdit1.Value, SpinEdit2.Value);Memo1.Lines.Values['ffCurrency'] := FloatToStrF(StrToFloatDef(Edit1.Text, 0), ffCurrency, SpinEdit1.Value, SpinEdit2.Value);end;///////End FloatToStrF━━━━━━━━━━━━━━━━━━━━━首部 function FloatToText(BufferArg: PChar; const Value; ValueType: TFloatValue; Format: TFloatFormat; Precision, Digits: Integer): Integer; $[SysUtils.pas功能 返回浮点数以指定格式转换成指针字符串的内存大小说明 Precision指定精度;Digits指定小数宽度参考 <NULL>例子///////Begin FloatToTextprocedure TForm1.Button1Click(Sender: TObject);varvBuffer: array[0..255] of Char;E: Extended;beginE := StrToFloatDef(Edit1.Text, 0);SpinEdit3.Value := FloatToText(vBuffer, E,fvExtended, ffNumber, SpinEdit1.Value, SpinEdit2.Value);Edit2.Text := Copy(vBuffer, 1, SpinEdit3.Value);end;///////End FloatToText(━━━━━━━━━━━━━━━━━━━━━首部 function FormatFloat(const Format: string; Value: Extended): string; $[SysUt ils.pas功能 返回浮点数类型以指定格式字符串Format转换成字符串说明 FormatFloat(',.00', 1234567890) = '1,234,567,890.00'参考 function SysUtils.FloatToTextFmt例子 Edit1.Text := FormatFloat(Edit2.Text, StrToFloatDef(Edit3.Text, 0));━━━━━━━━━━━━━━━━━━━━━首部 function FormatCurr(const Format: string; Value: Currency): string; $[SysUti ls.pas功能 返回货币类型以指定格式字符串Format转换成字符串说明 FormatCurr(',.00', 1234567890) = '1,234,567,890.00'参考 function SysUtils.FloatToTextFmt例子 Edit1.Text := FormatCurr(Edit2.Text, StrToCurrDef(Edit3.Text, 0));━━━━━━━━━━━━━━━━━━━━━首部 function FloatToTextFmt(Buf: PChar; const Value; ValueType: TFloatValue; For mat: PChar): Integer; $[SysUtils.pas功能 返回浮点数以指定格式字符串Format转换成指针字符串的内存大小说明 ValueType指定无类型参数Value的类型参考 <NULL>例子///////Begin FloatToTextFmtprocedure TForm1.Button1Click(Sender: TObject);varvBuffer: array[0..255] of Char;E: Extended;beginE := StrToFloatDef(Edit1.Text, 0);SpinEdit1.Value := FloatToTextFmt(vBuffer, E,fvExtended, PChar(Edit2.Text));Edit3.Text := Copy(vBuffer, 1, SpinEdit1.Value);end;///////End FloatToTextFmt━━━━━━━━━━━━━━━━━━━━━首部 procedure FloatToDecimal(var Result: TFloatRec; const Value; ValueType: TFlo atValue; Precision, Decimals: Integer); $[SysUtils.pas功能 将浮点数转换成浮点结构类型并返回到Result说明 ValueType指定类型;Precision指定精度;Decimals指定小数参考 type SysUtils.TFloatRec例子 <NULL>━━━━━━━━━━━━━━━━━━━━━首部 function DateTimeToTimeStamp(DateTime: TDateTime): TTimeStamp; $[SysUtils.pa s功能 返回日期时间类型转换成时间结构类型说明 <NULL>参考 type SysUtils.TTimeStamp例子 <NULL>━━━━━━━━━━━━━━━━━━━━━首部 function EncodeDate(Year, Month, Day: Word): TDateTime; $[SysUtils.pas功能 返回合并年、月、日得到的日期说明 当出现非法组合时将触发异常参考 function SysUtils.TryEncodeDate例子 Edit1.Text := DateToStr(EncodeDate(SpinEdit1.Value, SpinEdit2.Value, SpinEdi t3.Value));━━━━━━━━━━━━━━━━━━━━━首部 function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime; $[SysUtils.pas 功能 返回合并时、分、秒、微秒得到的时间说明 当出现非法组合时将触发异常参考 function SysUtils.TryEncodeTime例子 Edit1.Text := TimeToStr(EncodeTime(SpinEdit1.Value, SpinEdit2.Value, SpinEdi t3.Value, SpinEdit4.Value));━━━━━━━━━━━━━━━━━━━━━首部 procedure DecodeDate(const DateTime: TDateTime; var Year, Month, Day: Word); $[SysUtils.pas功能 分解日期为年、月、日说明 <NULL>参考 function SysUtils.DecodeDateFully例子///////Begin DecodeDateprocedure TForm1.Button1Click(Sender: TObject);varYear, Month, Day: Word;beginDecodeDate(Date, Year, Month, Day);SpinEdit1.Value := Year;SpinEdit2.Value := Month;SpinEdit3.Value := Day;end;///////End DecodeDate━━━━━━━━━━━━━━━━━━━━━首部 function DecodeDateFully(const DateTime: TDateTime; var Year, Month, Day, DO W: Word): Boolean; $[SysUtils.pas功能 分解日期为年、月、日、星期说明 [DOW:Day Of Week]参考 function SysUtils.DateTimeToTimeStamp例子///////Begin DecodeDateFullyprocedure TForm1.Button1Click(Sender: TObject);varYear, Month, Day, DOW: Word;beginDecodeDateFully(Date, Year, Month, Day, DOW);SpinEdit1.Value := Year;SpinEdit2.Value := Month;SpinEdit3.Value := Day;SpinEdit4.Value := DOW;end;///////End DecodeDateFully━━━━━━━━━━━━━━━━━━━━━首部 function InternalDecodeDate(const DateTime: TDateTime; var Year, Month, Day, DOW: Word): Boolean; $[SysUtils.pas功能 <NULL>说明 Kylix函数参考 function SysUtils.DecodeDateFully例子 <NULL>━━━━━━━━━━━━━━━━━━━━━首部 procedure DecodeTime(const DateTime: TDateTime; var Hour, Min, Sec, MSec: Wo rd); $[SysUtils.pas功能 分解时间为时、分、秒、微妙说明 <NULL>参考 function SysUtils.DateTimeToTimeStamp例子///////Begin DecodeTimeprocedure TForm1.Button1Click(Sender: TObject);varHour, Min, Sec, MSec: Word;beginDecodeTime(Time, Hour, Min, Sec, MSec);SpinEdit1.Value := Hour;SpinEdit2.Value := Min;SpinEdit3.Value := Sec;SpinEdit4.Value := MSec;end;///////End DecodeTime━━━━━━━━━━━━━━━━━━━━━首部 procedure DateTimeToSystemTime(const DateTime: TDateTime; var SystemTime: TSystemTime); $[SysUtils.pas功能 返回日期时间类型转换成系统时间类型说明 <NULL>参考 function SysUtils.DecodeDateFully;function SysUtils.DecodeTime例子 <NULL>━━━━━━━━━━━━━━━━━━━━━首部 function SystemTimeToDateTime(const SystemTime: TSystemTime): TDateTime; $[S ysUtils.pas功能 返回系统时间类型转换成日期时间类型说明 <NULL>参考 function SysUtils.EncodeDate;function SysUtils.EncodeTime例子 <NULL>━━━━━━━━━━━━━━━━━━━━━首部 function DayOfWeek(const DateTime: TDateTime): Word; $[SysUtils.pas功能 返回日期时间DateTime所在的星期说明 1(星期天),2(星期一),3(星期二),4(星期三),5(星期四),6(星期五),7(星期六)参考 function SysUtils.DateTimeToTimeStamp例子///////Begin DayOfWeekprocedure TForm1.Button1Click(Sender: TObject);constcWeekCn: array[1..7] of string =('星期天', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六');beginEdit1.Text := cWeekCn[DayOfWeek(Now)];end;///////End DayOfWeek━━━━━━━━━━━━━━━━━━━━━首部 function Date: TDateTime; $[SysUtils.pas功能 返回当前日期说明 Date - Int(Date)=0;参考 function SysUtils.DateTimeToString例子 Edit1.Text := DateToStr(Date);━━━━━━━━━━━━━━━━━━━━━delphi函数大全之D-G篇-详解2(2007-04-09 00:29:38)标签:delphi函数━━━━━━━━━━━━━━━━━━━━━首部 function FileExists(const FileName: string): Boolean; $[SysUtils.pas功能 返回文件名FileName是否有实体存在说明 包括隐藏文件参考 function SysUtils.FileAge例子 CheckBox1.Checked := FileExists(Edit1.Text);━━━━━━━━━━━━━━━━━━━━━。
delphi基本算法
delphi算法:DELPHI基本算法疯狂代码 / ĵ:http://Delphi/Article11679.html1.数论算法求两数最大公约数function gcd(a,b:eger):eger;beginb=0 then gcd:=agcd:=gcd (b,a mod B);end;求两数最小公倍数function lcm(a,b:eger):eger;begina< b then swap(a,B);lcm:=a;while lcm mod b >0 do inc(lcm,a);end;素数求法A.小范围内判断个数是否为质数:function prime (n: eger): Boolean;var I: eger;beginfor I:=2 to trunc(sqrt(n)) don mod I=0 then beginprime:=false; exit;end;prime:=true;end;B.判断long范围内数是否为素数(包含求50000以内素数表):procedure getprime;vari,j:long;p:.gif' />[1..50000] of boolean;beginfillchar(p,(p),true);p[1]:=false;i:=2;while i< 50000 do beginp[i] then beginj:=i*2;while j< 50000 do beginp[j]:=false;inc(j,i);end;end;inc(i);end;l:=0;for i:=1 to 50000 dop[i] then begininc(l);pr[l]:=i;end;end;{getprime}function prime(x:long):eger; var i:eger;beginprime:=false;for i:=1 to l dopr[i] >=x thenx mod pr[i]=0 then exit; prime:=true;end;{prime}2.3.4.求最小生成树A.Prim算法:procedure prim(v0:eger);varlowcost,closest:.gif' />[1..maxn] of eger;i,j,k,min:eger;beginfor i:=1 to n do beginlowcost[i]:=cost[v0,i];closest[i]:=v0;end;for i:=1 to n-1 do begin{寻找离生成树最近未加入顶点k}min:=maxlong;for j:=1 to n do(lowcost[j]< min) and (lowcost[j]< >0) then beginmin:=lowcost[j];k:=j;end;lowcost[k]:=0; {将顶点k加入生成树}{生成树中增加条新边k到closest[k]}{修正各点lowcost和closest值}for j:=1 to n docost[k,j]< lwocost[j] then beginlowcost[j]:=cost[k,j];closest[j]:=k;end;end;end;{prim}B.Kruskal算法:(贪心)按权值递增顺序删去图中边若不形成回路则将此边加入最小生成树 function find(v:eger):eger; {返回顶点v所在集合}var i:eger;begini:=1;while (i< =n) and (not v in v[i]) do inc(i);i< =n then find:=i find:=0;end;procedure kruskal;vartot,i,j:eger;beginfor i:=1 to n do v[i]:=[i];{化定义n个集合第I个集合包含个元素I}p:=n-1; q:=1; tot:=0; {p为尚待加入边数q为边集指针}sort;{对所有边按权值递增排序存于e[I]中e[I].v1和e[I].v2为边I所连接两个顶点序号e[I].len为第I条边长度} while p >0 do begini:=find(e[q].v1);j:=find(e[q].v2);i< >j then begininc(tot,e[q].len);v[i]:=v[i]+v[j];v[j]:=;dec(p);end;inc(q);end;writeln(tot);end;5.最短路径A.标号法求解单源点最短路径:vara:.gif' />[1..maxn,1..maxn] of eger;b:.gif' />[1..maxn] of eger; {b[i]指顶点i到源点最短路径} [Page]mark:.gif' />[1..maxn] of boolean;procedure bhf;varbest,best_j:eger;beginfillchar(mark,(mark),false);mark[1]:=true; b[1]:=0;{1为源点}repeatbest:=0;for i:=1 to n doIf mark[i] then {对每个已计算出最短路径点}for j:=1 to n do(not mark[j]) and (a[i,j] >0) then(best=0) or (b[i]+a[i,j]< best) then beginbest:=b[i]+a[i,j]; best_j:=j;end;best >0 then beginb[best_j]:=best;mark[best_j]:=true;end;until best=0;end;{bhf}B.Floyed算法求解所有顶点对的间最短路径:procedure floyed;beginfor I:=1 to n dofor j:=1 to n doa[I,j] >0 then p[I,j]:=I p[I,j]:=0; {p[I,j]表示I到j最短路径上j前驱结点} for k:=1 to n do {枚举中间结点}for i:=1 to n dofor j:=1 to n doa[i,k]+a[j,k]< a[i,j] then begina[i,j]:=a[i,k]+a[k,j];p[I,j]:=p[k,j];end;end;C. Dijkstra 算法:类似标号法本质为贪心算法vara:.gif' />[1..maxn,1..maxn] of eger;b,pre:.gif' />[1..maxn] of eger; {pre[i]指最短路径上I前驱结点} mark:.gif' />[1..maxn] of boolean;procedure dijkstra(v0:eger);beginfillchar(mark,(mark),false);for i:=1 to n do begind[i]:=a[v0,i];d[i]< >0 then pre[i]:=v0 pre[i]:=0;end;mark[v0]:=true;repeat {每循环次加入个离1集合最近结点并调整其他结点参数} min:=max; u:=0; {u记录离1集合最近结点}for i:=1 to n do(not mark[i]) and (d[i]< min) then beginu:=i; min:=d[i];end;u< >0 then beginmark[u]:=true;for i:=1 to n do(not mark[i]) and (a[u,i]+d[u]< d[i]) then begind[i]:=a[u,i]+d[u];pre[i]:=u;end;end;until u=0;end;D.计算图传递闭包Procedure Longlink;VarT:.gif' />[1..maxn,1..maxn] of boolean;BeginFillchar(t,(t),false);For k:=1 to n doFor I:=1 to n doFor j:=1 to n do T[I,j]:=t[I,j] or (t[I,k] and t[k,j]);End;6.0-1背包问题(部分背包问题可有贪心法求解:计算Pi/Wi)数据结构:w[i]:第i个背包重量;p[i]:第i个背包价值;(1)0-1背包: 每个背包只能使用次或有限次(可转化为次):A.求最多可放入重量NOIP2001 装箱问题有个箱子容量为v(正整数o≤v≤20000)同时有n个物品(o≤n≤30)每个物品有个体积 (正整数)要求从 n 个物品中任取若千个装入箱内使箱子剩余空间为最小l 搜索思路方法procedure search(k,v:eger); {搜索第k个物品剩余空间为v}var i,j:eger;beginv< best then best:=v;v-(s[n]-s[k-1]) >=best then exit; {s[n]为前n个物品重量和}k< =n then beginv >w[k] then search(k+1,v-w[k]);search(k+1,v);end;end;l DPF[I,j]为前i个物品中选择若干个放入使其体积正好为j标志为布尔型实现:将最优化问题转化为判定性问题F[I,j]=f[i-1,j-w[i]] (w[I]< =j< =v) 边界:f[0,0]:=true. [Page]For I:=1 to n doFor j:=w[I] to v do F[I,j]:=f[I-1,j-w[I]];优化:当前状态只和前阶段状态有关可降至维F[0]:=true;For I:=1 to n do beginF1:=f;For j:=w[I] to v doIf f[j-w[I]] then f1[j]:=true;F:=f1;End;B.求可以放入最大价值F[I,j]=C.求恰好装满情况数(2)每个背包可使用任意次:A.求最多可放入重量状态转移方程为f[I,j]=max{f[i-w[j]B.求可以放入最大价值USACO 1.2 Score Inflation进行次竞赛总时间T固定有若干种可选择题目每种题目可选入数量不限每种题目有个ti(解答此题所需时间)和个si(解答此题所得分数)现要选择若干题目使解这些题总时间在T以内前提下所得总分最大求最大得分*易想到:f[i,j] = max { f [i- k*w[j], j-1] + k*v[j] } (0< =k< = i div w[j])其中f[i,j]表示容量为i时取前j种背包所能达到最大值*优化:BeginFillChar(problem,SizeOf(problem),0);Assign(Input,\'inflate.in\');Re(Input);Readln(M,N);For i:=1 To N DoWith problem[i] DoReadln(po,time);Close(Input);FillChar(f,SizeOf(f),0);For i:=1 To M DoFor j:=1 To N DoIf i-problem[j].time >=0 ThenBegint:=problem[j].po+f[i-problem[j].time];If t >f[i] Then f[i]:=t;End;Assign(Output,\'inflate.out\');Rewrite(Output);Writeln(f[M]);Close(Output);End.C.求恰好装满情况数Ahoi2001 Problem2求自然数n本质区别质数和表达式数目思路生成每个质数系数排列在测试这是通法 procedure try(dep:eger);var i,j:eger;begincal; {此过程计算当前系数计算结果now为结果} now >n then exit; {剪枝}dep=l+1 then begin {生成所有系数}cal;now=n then inc(tot);exit;end;for i:=0 to n div pr[dep] do beginxs[dep]:=i;try(dep+1);xs[dep]:=0;end;end;思路 2递归搜索效率较高procedure try(dep,rest:eger);var i,j,x:eger;begin(rest< =0) or (dep=l+1) then beginrest=0 then inc(tot);exit;end;for i:=0 to rest div pr[dep] dotry(dep+1,rest-pr[dep]*i);end;思路 3:可使用动态规划求解USACO1.2 money systemV个物品背包容量为n求放法总数转移方程:Procedure update;var j,k:eger;beginc:=a;for j:=0 to n doa[j] >0 thenfor k:=1 to n div now doj+now*k< =n then inc(c[j+now*k],a[j]);a:=c;end;{}beginread(now); {读入第个物品重量}i:=0; {a[i]为背包容量为i时放法总数}while i< =n do begina[i]:=1; inc(i,now); end; {定义第个物品重整数倍重量a值为1作为初值} for i:=2 to v dobeginread(now);update; {动态更新}end;writeln(a[n]);7.排序算法A.快速排序:procedure sort(l,r:eger);var i,j,mid:eger;begini:=l;j:=r; mid:=a[(l+r) div 2]; {将当前序列在中间位置数定义为中间数} [Page] repeatwhile a[i]< mid do inc(i); {在左半部分寻找比中间数大数}while mid< a[j] do dec(j);{在右半部分寻找比中间数小数}i< =j then begin {若找到组和排序目标不致数对则交换它们}swap(a[i],a[j]);inc(i);dec(j); {继续找}end;until i >j;l< j then sort(l,j); {若未到两个数边界则递归搜索左右区间}i< r then sort(i,r);end;{sort}B.插入排序:procedure insert_sort(k,m:word); {k为当前要插入数m为插入位置指针}var i:word; p:0..1;beginp:=0;for i:=m downto 1 dok=a[i] then exit;repeatIf k >a[m] then begina[m+1]:=k; p:=1;endbegina[m+1]:=a[m]; dec(m);end;until p=1;end;{insert_sort}l 主中为:a[0]:=0;for I:=1 to n do insert_sort(b[I],I-1);C.选择排序:procedure sort;var i,j,k:eger;beginfor i:=1 to n-1 do begink:=i;for j:=i+1 to n doa[j]< a[k] then k:=j; {找出a[I]..a[n]中最小数和a[I]作交换} k< >i then begina[0]:=a[k];a[k]:=a[i];a[i]:=a[0];end;end;end;D. 冒泡排序procedure sort;var i,j,k:eger;beginfor i:=n downto 1 dofor j:=1 to i-1 doa[j] >a[i] then begina[0]:=a[i];a[i]:=a[j];a[j]:=a[0];end;end;E.堆排序:procedure st(i,m:eger);{调整以i为根子树成为堆,m为结点总数}var k:eger;begina[0]:=a[i]; k:=2*i;{在完全 2叉树中结点i左孩子为2*i,右孩子为2*i+1}while k< =m do begin(k< m) and (a[k]< a[k+1]) then inc(k);{找出a[k]和a[k+1]中较大值}a[0]< a[k] then begin a[i]:=a[k];i:=k;k:=2*i; endk:=m+1;end;a[i]:=a[0]; {将根放在合适位置}end;procedure heapsort;varj:eger;beginfor j:=n div 2 downto 1 do st(j,n);for j:=n downto 2 do beginswap(a[1],a[j]);st(1,j-1);end;end;F. 归并排序{a为序列表tmp为辅助}procedure merge(var a:listtype; p,q,r:eger);{将已排序好子序列a[p..q]和a[q+1..r]合并为有序tmp[p..r]}var I,j,t:eger;tmp:listtype;begint:=p;i:=p;j:=q+1;{t为tmp指针I,j分别为左右子序列指针}while (t< =r) do begin(i< =q){左序列有剩余} and ((j >r) or (a[i]< =a[j])) {满足取左边序列当前元素要求} then begintmp[t]:=a[i]; inc(i);endbegintmp[t]:=a[j];inc(j);end;inc(t);end;for i:=p to r do a[i]:=tmp[i];end;{merge}procedure merge_sort(var a:listtype; p,r: eger); {合并排序a[p..r]} var q:eger;beginp< >r then beginq:=(p+r-1) div 2;merge_sort (a,p,q);merge_sort (a,q+1,r);merge (a,p,q,r);end;end;{}beginmerge_sort(a,1,n);end.G.基数排序思想:对每个元素按从低位到高位对每位进行次排序8.高精度计算A.B.C.D.9.树遍历顺序转换A. 已知前序中序求后序 [Page]procedure Solve(pre,mid:);var i:eger;begin(pre=\'\') or (mid=\'\') then exit;i:=pos(pre[1],mid);solve(copy(pre,2,i),copy(mid,1,i-1));solve(copy(pre,i+1,length(pre)-i),copy(mid,i+1,length(mid)-i)); post:=post+pre[1]; {加上根递归结束后post即为后序遍历}end;B.已知中序后序求前序procedure Solve(mid,post:);var i:eger;begin(mid=\'\') or (post=\'\') then exit;i:=pos(post[length(post)],mid);pre:=pre+post[length(post)]; {加上根递归结束后pre即为前序遍历} solve(copy(mid,1,I-1),copy(post,1,I-1));solve(copy(mid,I+1,length(mid)-I),copy(post,I,length(post)-i)); end;C.已知前序后序求中序function ok(s1,s2:):boolean;var i,l:eger; p:boolean;beginok:=true;l:=length(s1);for i:=1 to l do beginp:=false;for j:=1 to l dos1[i]=s2[j] then p:=true;not p then begin ok:=false;exit;end;end;end;procedure solve(pre,post:);var i:eger;begin(pre=\'\') or (post=\'\') then exit;i:=0;repeatinc(i);until ok(copy(pre,2,i),copy(post,1,i));solve(copy(pre,2,i),copy(post,1,i));midstr:=midstr+pre[1];solve(copy(pre,i+2,length(pre)-i-1),copy(post,i+1,length(post)-i-1));end;10.求图弱连通子图(DFS)procedure dfs ( now,color: eger);beginfor i:=1 to n doa[now,i] and c[i]=0 then beginc[i]:=color;dfs(I,color);end;end;11.拓扑排序寻找数列其中任意连续p项的和为正任意q 项的和为负若不存在则输出NO.12.进制转换A.整数任意正整数进制间互化NOIP1996数制转换设串A$结构为: A$=\'mp\'其中m为数字串(长度< =20),而n,p均为1或2位数字串(其中所表达内容在2-10的间) 要求:从键盘上读入A$后(不用正确性检查),将A$中数字串m(n进制)以p进制形式输出.例如:A$=\'48< 10 >8\'其意义为:将10进制数48,转换为8进制数输出.输出结果:48< 10 >=60< 8 >B.实数任意正整数进制间互化C.负数进制:NOIP2000设计个读入个十进制数基数和个负进制数基数并将此十进制数转换为此负 进制下数:-R∈{-2-3-4, (20)13.全排列和组合生成排列生成:(1..n)procedure solve(dep:eger);vari:eger;begindep=n+1 then begin writeln(s);exit; end;for i:=1 to n donot used[i] then begins:=s+chr(i+ord(\'0\'));used[i]:=true;solve(dep+1);s:=copy(s,1,length(s)-1); used[i]:=false;end;end;组合生成(1..n中选取k个数所有方案)procedure solve(dep,pre:eger);vari:eger;begindep=k+1 then begin writeln(s);exit; end;for i:=1 to n do(not used[i]) and (i >pre) then begins:=s+chr(i+ord(\'0\'));used[i]:=true;solve(dep+1,i);s:=copy(s,1,length(s)-1); used[i]:=false;end;end;14 递推关系计算字串序号模型 [Page]USACO1.2.5 StringSobits长度为N (N< =31)01串中1个数小于等于L串组成集合中找出按大小排序后第I个01串数字划分模型*NOIP2001数划分将整数n分成k份且每份不能为空任意两种分法不能相同(不考虑顺序)d[0,0]:=1;for p:=1 to n dofor i:=p to n dofor j:=k downto 1 do inc(d[i,j],d[i-p,j-1]);writeln(d[n,k]);*变形1:考虑顺序d[ i, j] : = d [ i-k, j-1] (k=1..i)*变形2:若分解出来每个数均有个上限md[ i, j] : = d [ i-k, j-1] (k=1..m)15.算符优先法求解表达式求值问题const maxn=50;vars1:.gif' />[1..maxn] of eger; {s1为数字栈}s2:.gif' />[1..maxn] of char; {s2为算符栈}t1,t2:eger; {栈顶指针}procedure calcu;varx1,x2,x:eger;p:char;beginp:=s2[t2]; dec(t2);x2:=s1[t1]; dec(t1);x1:=s1[t1]; dec(t1);p of\'+\':x:=x1+x2;\'-\':x:=x1-x2;\'*\':x:=x1*x2;\'/\':x:=x1 div 2;end;inc(t1);s1[t1]:=x;end;procedure work;var c:char;v:eger;begint1:=0;t2:=0;read©;while c< >\';\' doc of\'+\',\'-\': beginwhile (t2 >0) and (s2[t2]< >\'(\') do calcu;inc(t2);s2[t2]:=c;read©;end ;\'*\',\'/\':begin(t2 >0) and ((s2[t2]=\'*\') or (s2[t2]=\'/\')) then calcu; inc(t2);s2[t2]:=c;read©;end;\'(\':begin inc(t2); s2[t2]:=c; read©; end;\')\':beginwhile s2[t2]< >\'(\' do calcu;dec(t2); read©;end;\'0\'..\'9\':beginv:=0;repeatv:=10*v+ord©-ord(\'0\');read©;until (c< \'0\') or (c >\'9\');inc(t1); s1[t1]:=v;end;end;while t2 >0 do calcu;writeln(s1[t1]);end;16.查找算法折半查找function binsearch(k:keytype):eger;var low,hig,mid:eger;beginlow:=1;hig:=n;mid:=(low+hig) div 2;while (a[mid].key< >k) and (low< =hig) do begina[mid].key >k then hig:=mid-1low:=mid+1;mid:=(low+hig) div 2;end;low >hig then mid:=0;binsearch:=mid;end;树形查找2叉排序树:每个结点值都大于其左子树任结点值而小于其右子树任结点值 查找function treesrh(k:keytype):poer;var q:poer;beginq:=root;while (q< >nil) and (q^.key< >k) dok< q^.key then q:=q^.leftq:=q^.right;treesrh:=q;end;17.KMP算法18.贪心*会议问题(1) n个活动每个活动有个开始时间和个结束时间任时刻仅项活动进行求满足活动数最多情况解:按每项活动结束时间进行排序排在前面优先满足(2)会议室空闲时间最少(3)每个客户有个愿付租金求最大利润(4)共R间会议室第i个客户需使用i间会议室费用相同求最大利润附录1 常用窍门技巧1.带权中位数我国蒙古大草原上有N(N是不大于100自然数)个牧民定居点P1(X1Y1)、P2(X2Y2)、 …Pn(XnYn)相应地有关权重为Wi现在要求你在大草原上找点P(XpYp)使P点到任 点Pi距离Di和Wi的积的和为最小 [Page] 即求 D=W1*D1+W2*D2+…+Wi*Di+…+Wn*Dn 有最小值 结论:对x和y两个方向分别求解带权中位数转化为维设最佳点p为点k则点k满足:令W为点k到其余各点带权距离的和则sigema( i=1 to k-1) Wi*Di < = W/2sigema( i=k+1 to n) Wi*Di < = W/2同时满足上述两式点k即为带权中位数2.求序列中连续子序列最大和beginmaxsum:=-maxlong;sum:=0;for i:=1 to n do begininc(sum,data[i]);sum >maxsum then maxsum:=sum; sum< 0 then sum:=0;end;writeln(maxsum);end; 2009-2-12 3:44:36疯狂代码 /。
寻路算法
A* 寻路算法2010-02-11 1:44施健泉1.概述虽然掌握了A* 算法的人认为它容易,但是对于初学者来说,A* 算法还是很复杂的。
2.搜索区域(The Search Area)我们假设某人要从A 点移动到B 点,但是这两点之间被一堵墙隔开。
如图1。
(绿色是A ,红色是B ,中间蓝色是墙)图 1你应该注意到了,我们把要搜寻的区域划分成了正方形的格子。
这是寻路的第一步,简化搜索区域,就像我们这里做的一样。
这个特殊的方法把我们的搜索区域简化为了2维数组。
数组的每一项代表一个格子,它的状态就是可走(walkable) 和不可走(unwalkable)两种。
通过计算出从 A 到 B 需要走过哪些方格,就找到了路径。
一旦路径找到了,人物便从一个方格的中心移动到另一个方格的中心,直至到达目的地。
方格的中心点我们成为“节点(nodes) ”。
如果你读过其他关于A* 寻路算法的文章,你会发现人们常常都在讨论节点。
为什么不直接描述为方格呢?因为我们有可能把搜索区域划为其他多边形而不是正方形,例如可以是六边形,矩形,甚至可以是任意多变形。
而节点可以放在任意多边形里面,可以放在多变形的中心,也可以放在多边形的边上。
我们使用这个系统,因为它最简单。
3.开始搜索(Starting the Search)一旦我们把搜寻区域简化为一组可以量化的节点后,就像上面做的一样,我们下一步要做的便是查找最短路径。
在A* 中,我们从起点开始,检查其相邻的方格,然后向四周扩展,直至找到目标。
我们这样开始我们的寻路旅途:3.1从起点A 开始,并把它就加入到一个由方格组成的open list( 开放列表) 中。
这个open list 有点像是一个购物单。
当然现在open list 里只有一项,它就是起点A ,后面会慢慢加入更多的项。
open list 里的格子是路径可能会是沿途经过的,也有可能不经过。
基本上open list 是一个待检查的方格列表。
DELPHI编程技巧集锦
DELPHI编程技巧集锦(1)董占山(中国农科院棉花研究所,河南安阳,455112)美国著名的《Delphi开发者杂志(Delphi Developer's Journal)》是世界上众多Delphi程序员必读的专业杂志,在国内我们很少有机会读到这份优秀的专业刊物,但是我们可以在Inprise公司()的网页上看到该杂志刊登的一些优秀文章。
同时,还可以通过电子邮件订阅该杂志免费提供的Delphi使用技巧,订阅网址为/ddj/bor-f.htm。
笔者从中筛选出一些十分有用的Delphi使用技巧和文章,编译出来,与广大Delphi爱好者分享。
有什么意见和建议可以直接给笔者发电子邮件(dzs@)。
读者请注意,本文中的内容多以Delphi 4为例进行介绍,请使用其他版本的读者根据实际情况灵活运用。
一、Delphi集成环境与代码调试A 修改Delphi的系统信息默认的Delphi消息、警告和例外描述都是英文的,将这些内容翻译成另一种语言或修改它们使其适合你的需要的最简单方法是编辑资源文件并改变相应的字符串,这些文件位于BIN目录。
主要资源文件有:SysUtils 单元的信息(文件没有找到、转换错误信息等)在sysutils.res中,数据库错误信息在dbconsts.res中,VCL 信息在consts.res中。
注意一些字符串使用格式字符,如%s或%d,来产生最终的字符串,在这种情况下,应将这些字符保留在适当的位置。
B 如何清除无用代码Delphi提供了自动清除源代码中无用代码的强大功能,一般来说,当你保存文件时,Delphi自动将源代码中空的类方法删除,保证了源代码的清洁。
在没有编译和保存文件的前提下,也可以清除无用代码,方法是:在Delphi 3/4中单击“File”*“Save As...”菜单命令(在Delphi 1/2中单击“File”*“Save File As...”菜单命令),打开“Save As...”对话窗口,单击“取消”按钮即可。
常用DELPHI实现算法大全
常用DELPHI实现算法大全1.数论算法求两数的最大公约数function gcd(a,b:integer):integer;beginif b=0 thengcd:=aelsegcd:=gcd (b,a mod B);end;求两数的最小公倍数function lcm(a,b:integer):integer;beginif a< b then swap(a,B);lcm:=a;while lcm mod b >0 do inc(lcm,a);end;素数的求法A.小范围内判断一个数是否为质数:function prime (n: integer): Boolean;var I: integer;beginfor I:=2 to trunc(sqrt(n)) doif n mod I=0 then beginprime:=false; exit;end;prime:=true;end;B.判断longint范围内的数是否为素数(包含求50000以内的素数表):procedure getprime;vari,j:longint;p:array[1..50000] of boolean;beginfillchar(p,sizeof(p),true);p[1]:=false;i:=2;while i< 50000 do beginif p[i] then beginj:=i*2;while j< 50000 do beginp[j]:=false;inc(j,i);end;end;inc(i);end;l:=0;for i:=1 to 50000 doif p[i] then begininc(l);pr[l]:=i;end;end;{getprime}function prime(x:longint): integer; var i:integer;beginprime:=false;for i:=1 to l doif pr[i] >=x then breakelse if x mod pr[i]=0 then exit; prime:=true;end;{prime}2.3.4.求最小生成树A.Prim算法:procedure prim(v0:integer);varlowcost,closest:array[1..maxn] of integer;i,j,k,min:integer;beginfor i:=1 to n do beginlowcost[i]:=cost[v0,i];closest[i]:=v0;end;for i:=1 to n-1 do begin{寻找离生成树最近的未加入顶点k}min:=maxlongint;for j:=1 to n doif (lowcost[j]< min) and (lowcost[j]< >0) then beginmin:=lowcost[j];k:=j;end;lowcost[k]:=0; {将顶点k加入生成树}{生成树中增加一条新的边k到closest[k]}{修正各点的lowcost和closest值}for j:=1 to n doif cost[k,j]< lwocost[j] then beginlowcost[j]:=cost[k,j];closest[j]:=k;end;end;end;{prim}B.Kruskal算法:(贪心)按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。
Flash平台上自动寻路(A)算法优化设计
---------------------------------------------------------------范文最新推荐------------------------------------------------------ Flash平台上自动寻路(A)算法优化设计摘要:Flash平台技术是一项RIA(Rich Internet Application)开发以及应用技术,在如今的互联网中,随处可见它的身影,而A*寻路算法则是RIA游戏制作过程中的核心算法,它解决了地图中2点之间寻路的问题,并且应用于很多游戏中。
本论文对使用Flash 平台技术实现A*寻路算法进行了研究,探讨了A*寻路算法的实现方法,并且利用了Flash中的关键技术,设计制作了一个2.5D人物寻路的模型并通过FMS(流媒体服务器)构建及时交流的虚拟社区环境,从而更加生动的体现出A*寻路算法的功能。
最后对A*寻路算法的优化进行了讨论,并且对这项技术的应用前景作了一定的展望。
关键词:寻路算法优化;游戏算法;富媒体应用10556USING THE FLASH PLATFORM TECHNOLOGY ACHIEVE THE ASTAR ALGORITHM IN THE1 / 17GAMEAbstract: Flash platform technology is an application and development technology of RIA field.Nowadays,this technology can be found in many applications in the Internet.Astar algorithm is the core algorithm in the process of the game production.It solves the problem of producing the path between two points in the map.This algorithm is used in many games.In this thesis,I research the flash platform technology and Astar algorithm,discuss the method of achieving the Astar and make a 2.5D demo with a moving person using the flash technology.At last,I make a discussion of the optimization of Astar algorithm and make a certain outlook of the application of this technology.Keywords:Astar lgorithm ; Game Programme; Rich Internet Application目录摘要i---------------------------------------------------------------范文最新推荐------------------------------------------------------ Abstracti目录ii1绪论11.1课题研究背景及意义11.2设计的基本思想11.3开发环境24结论304.1总结304.2对于FLASH平台技术结合A*寻路算法的应用展望303 / 174.2.1Flash平台技术的优势304.2.2Flash平台技术结合A*寻路算法的市场应用及前景32致谢35参考文献36附录371绪论1.1课题研究背景及意义随着互联网的飞速发展,如今人们已经可以通过网页玩游戏而无需像过去那样下载客户端并且花费时间安装。
关于寻路算法的一些思考(4):A- 算法的变体
定向搜索在A*算法的循环中,OPEN集合用来保存所有用于寻找路径的被搜索节点。
定向搜索是在A*算法基础上,通过对OPEN集合大小设置约束条件而得到的变体算法。
当集合太大的时候,最不可能出现在最优路径上的节点将会被剔除。
这样做会带来一个缺点:由于必须得保持这样的筛选,所以可选择的数据结构类型会受到限制。
迭代深化(Iterative deepening)迭代深化是一种很多AI算法采用的方法,开始的时候给一个估计值,然后通过迭代使它越来越精确。
这个名字来源于游戏树搜索中对接下来几次操作的提前预判(例如,在象棋游戏中)。
你可以通过向前预判更多的操作来深化游戏树。
一旦当你的结果不发生变化或提高很多,就可以认为你已经得到了一个非常好的结果,即使让它更精确,结果也不会再改善。
在迭代深化A*(IDA*)算法中,“深度”是f 值当前的一个截断值。
当 f 值太大的时候,节点不会被考虑(也就是说,不会被加入到OPEN集中)。
第一次循环时,只需要处理非常少的节点。
随后的每次循环,都会增加访问的节点数。
如果发现路径得到优化,就继续增加当前的截断值,否则结束。
更多细节,参见链接。
我个人并不看好IDA*算法在游戏地图寻路中的应用。
迭代深化的算法往往增加了计算时间,同时降低了内存需求。
然而,在地图寻路的场景中,节点仅仅包含坐标信息,所需要的内存非常小。
所以减少这部分内存开销并不会带来什么优势。
动态加权在动态加权算法中,你假定在搜索开始时快速达到(任意)一个位置更为重要,在搜索结束时到达目标位置更为重要。
f(p) = g(p) + w(p) * h(p)有一个权值(w >= 1 )和该启发式关联。
当不断接近目标位置的时候,权重值也不断降低。
这样降低了启发式函数的重要性,并增加了路径实际代价的相对重要性。
带宽搜索带宽搜索有两个被认为非常有用的特性。
这个算法变体假设h 是一个估计过高的值,但它的估计误差不会超过e。
A寻路算法(For初学者)
A*寻路算法(For初学者)This article has been translated into Spanish and French. Other translations are welcome.While it is easy once you get the hang of it, the A* (pronounced A-star) algorithm can be complicated for beginners. There are plenty of articles on the web that explain A*, but most are written for people who understand the basics already. This one is for the true beginner.虽然掌握了A*(读作A-star)算法就认为它很容易,对于初学者来说,它却是复杂的。
网上有很多解释A*的文章,不过大多数是写给理解了基础知识的人。
本文是给初学者的。
This article does not try to be the definitive work on the subject. Instead it describes the fundamentals and prepares you to go out and read all of those other materials and understand what they are talking about. Links to some of the best are provided at the end of this article, under Further Reading.本文并不想成为关于这个主题的权威论文。
实际上它讨论了基础知识并为你做一些准备,以便进一步阅读其他资料和理解它们讨论的内容。
Delphifindfirst函数的用法
Delphifindfirst函数的用法函数名称: findfirst函数原型: int findfirst(char *fname,struct ffblk *ptr,int attrib) 函数功能: 寻找与fname相匹配的第一个文件名称函数返回:参数说明: ptr-保存查找到的文件信息所属文件:#include#includeint main(){struct ffblk ffblk;int done;printf("Directory listing of *.*");done=findfirst("*.*",&ffblk,0);while (!done){printf("%s", ffblk.ff_name);done=findnext(&ffblk);}return 0;}int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功返回0pathname为指定的目录名和文件名,如"C:\\WPS\\TXT"ffblk为指定的保存文件信息的一个结构,定义如下:┏━━━━━━━━━━━━━━━━━━┓┃struct ffblk ┃┃{ ┃┃ char ff_reserved[21]; /*DOS保留字*/┃ ┃ char ff_attrib; /*文件属性*/ ┃┃ int ff_ftime; /*文件时间*/ ┃┃ int ff_fdate; /*文件日期*/ ┃┃ long ff_fsize; /*文件长度*/ ┃┃ char ff_name[13]; /*文件名*/ ┃┃} ┃┗━━━━━━━━━━━━━━━━━━┛attrib为文件属性,由以下字符代表┏━━━━━━━━━┳━━━━━━━━┓┃FA_RDONLY 只读文件┃FA_LABEL 卷标号┃ ┃FA_HIDDEN 隐藏文件┃FA_DIREC 目录┃ ┃FA_SYSTEM 系统文件┃FA_ARCH 档案┃ ┗━━━━━━━━━┻━━━━━━━━┛例:struct ffblk ff;findfirst("*.wps",&ff,FA_RDONLY);。
浅谈游戏自动寻路A算法
浅谈游戏自动寻路A*算法我们先看下最好优先算法的逻辑(起始为止为A结束位置是P,字母后数字为节点的估价值):搜索的过程中设置两个表:OPEN和CLOSE。
OPEN表保存了所有已生成的未考察的节点。
CLOSE表中记录了已访问的节点。
算法中有一步是根据估价函数重新排列OPEN表,这样循环中的每一步值考虑OPEN中状态最好的节点搜索过程如下:1.初始状态OPEN = [A5];CLOSED=[ ] ;2.估算A5,取得所有子节点,并放入OPEN表中OPEN = [B4,C4,D6];CLOSED = [A5];3.估算B4,取得所有子节点,并放入OPEN表中OPEN = [C4,E5,F5,D6];CLOSED = [B4,A5];4.估算C4,取得所有子节点,并放入OPEN表中OPEN = [H3,G4,E5,F5,D6];CLOSED = [C4,B4,A5];5.估算H3,取得所有子节点,并放入OPEN表中OPEN = [O2,P3,G4,E5,F5,D6];CLOSED = [H3,C4,B4,A5];6.估算O2,取得所有子节点,并放入OPEN表中OPEN = [P3,G4,E5,F5,D6];CLOSED = [O2,H3,C4,B4,A5];7.估算P3得到解伪代码如下:Best_First_Seach(){Open = [起始节点];Closed = [ ];while(Open表非空){从Open中取得一个节点X,并从Open表中删除。
if(X节点是目标节点){求的路径PATH;return PATH;}for(每个X的子节点Y){if(Y不在OPEN表和CLOSE表中){求Y的估价值;将Y插入OPEN表中;}else if(Y在OPEN表中){if(Y的估价值小于OPEN表的估价值)更新OPEN表中的估价值;}else{if(Y的估价值小于CLOSE表的估价值)更新CLOSE表中的股价值从CLOSE表中移出节点,放入OPEN表中;}}讲X节点插入CLOSE表中;按照估价值讲OPEN表中的节点排序;}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
作者 : kikyo
标题 : A* 算法寻路(delphi)
关键字: A* 算法寻路(delphi)
分类 : 个人专区
密级 : 公开
(评分: , 回复: 0, 阅读: 1369) ??
A* 算法寻路(delphi)
{--------------------------------------------------------------------
NodeData[test.X, test.Y].h := judgeH(test, Goal);
NodeData[test.X, test.Y].f := NodeData[test.X, test.Y].h + NodeData[test.X, test.Y].g;
NodeData[test.X, test.Y].father := NowNode;
push(test);
end;
end;
result := false; //寻路失败
end;
-------------------------------------------------------------------- }
function TAStart.FindRoad(Start, Goal: Tpoint): bool;
const //0 1 2 3 4 5 6 7 方向
7 ★ 3
6 5 4
-1,0 ★ 1,0
-1,1 0,1 1,1
begin
NodeData[test.X, test.Y].g := NodeData[NowNode.x, NowNode.y].g + PositionV[i];
NodeData[test.X, test.Y].f := NodeData[test.X, test.Y].h + NodeData[test.X, test.Y].g;
PositionV : array [0..7] of integer = (14,10,14,10,14,10, 14, 10); //距离
var
NowNode : TPoint;
test : TPoint;
i : integer;
begin
push(Start); //开始节点加入开放列表
(test.Y < 0 ) or (test.Y > MapHeight-1) or
Байду номын сангаас (test.X < 0 ) or (test.X > MapWidth -1) then
begin
Continue;
PositionX : array [0..7] of integer = (-1, 0, 1, 1, 1, 0, -1, -1); //x方向
PositionY : array [0..7] of integer = (-1,-1,-1, 0, 1, 1, 1, 0); //y方向
//如果将终点加入开放列表,返回成功,结束循环
if (test.X = Goal.X) and (test.Y = Goal.Y) then
begin
NodeData[Goal.X, Goal.Y].father := NowNode;
result := True;
exit;
end;
//不可行走 超出范围 在封闭列表 则忽略
if (TestPoint(test) = false ) or (TestList(test) = 2) or
函数:FindRoad
功能:采用A* 算法进行寻路
参数:起始节点 和 到达节点
返回:0 失败 1 成功
说明: 八个字向定义 设 人物到 点 1 3 5 7 距离均为 10 设 人物到 点 0 2 4 6 距离均为 14
0 1 2 -1,-1 0,-1 1,-1
end;
if (TestList(test) = 1) then
begin //在开放列表
if NodeData[test.X, test.Y].g > NodeData[NowNode.X, NowNode.y].g + PositionV[i] then
//如开放列表是空的 结束循环.寻路失败
while OpenList.Count > 0 do
begin
NowNode := GetMinFNode(); //将最小F值做为当前块
NodeData[NowNode.X, NowNode.Y].flag := 2;
pop(OpenList, NowNode); //将最小F值从开放列表中删除
for i := 0 to 7 do
begin
test.X := NowNode.X + PositionX[i];
test.Y := NowNode.Y + PositionY[i];
NodeData[test.X, test.Y].father := NowNode;
end;
Continue;
end; //不在开放列表
NodeData[test.X, test.Y].g := NodeData[NowNode.x, NowNode.y].g + PositionV[i];