现在的位置: 首页 > 综合 > 正文

浙大acm2822

2013年10月23日 ⁄ 综合 ⁄ 共 1641字 ⁄ 字号 评论关闭

http://acm.hdu.edu.cn/showproblem.php?pid=2822

function dogs() {
		var data = getData();
		var s = data.start;
		var t = data.target;
		var w = data.w;
		var h = data.h;

		var open = [];
		var close = [];

		var rst = cal(data);

		$('body').append(disp(rst));

		function cal(data) {

			s.h = H(s);
			s.p = null;// 父节点,即上一步
			open.push(s);

			var count = 2000;
			while (open.length != 0 && count-- > 0) {
				var cur = open.shift();
				close.push(cur);
				if (cur.x == t.x && cur.y == t.y) {
					return cur;
				}
				var arr = [ {
					x : cur.x - 1,
					y : cur.y
				}, {
					x : cur.x + 1,
					y : cur.y
				}, {
					x : cur.x,
					y : cur.y - 1
				}, {
					x : cur.x,
					y : cur.y + 1
				} ];

				for ( var i = 0; i < arr.length; i++) {
					var ai = arr[i];
					if (check(ai)) {
						ai.h = H(ai) + cur.h;
						ai.p = cur;
						// 插入
						var j = 0;
						for (; j < open.length; j++) {
							var oi = open[j];
							if (ai.h < oi.h) {
								break;
							}
						}
						open.splice(j, 0, ai);
					}
				}

			}

		}

		// 检测是否可以放入open
		function check(myPoint) {
			var rst = true;
			if (myPoint.x == -1 || myPoint.y == -1 || myPoint.x == h
					|| myPoint.y == w) {
				rst = false;
			}
			for ( var i = 0; i < close.length && rst; i++) {
				var ci = close[i];
				if (ci.x == myPoint.x && ci.y == myPoint.y) {
					rst = false;
					break;
				}
			}
			for ( var i = 0; i < open.length && rst; i++) {
				var oi = open[i];
				if (oi.x == myPoint.x && oi.y == myPoint.y) {
					rst = false;
					break;
				}
			}
			return rst;
		}

		// 估价函数
		function H(myPoint) {
			var rst = 0;
			var dig = 0;
			if (data[myPoint.x][myPoint.y] == 0) {
				dig = 10000;
			}
			rst = Math.abs(myPoint.x - t.x) + Math.abs(myPoint.y - t.y) + dig;
			return rst;
		}

		function disp(endPoint) {
			var rst = [];
			while (endPoint) {
				if (data[endPoint.x][endPoint.y] == 0) {
					rst.push((endPoint.x + 1) + "," + (endPoint.y + 1));
				}
				endPoint = endPoint.p;
			}
			rst = "<br/>" + rst.reverse().join('<br/>');
			return rst;
		}

		function getData() {
			var rst = [];
			rst.push('001000'.split(''));
			rst.push('111010'.split(''));
			rst.push('000010'.split(''));
			rst.push('100000'.split(''));
			rst.push('100000'.split(''));
			rst.push('101000'.split(''));
			rst.start = {
				x : 2,
				y : 4
			};
			rst.target = {
				x : 5,
				y : 2
			};
			rst.h = rst.length;
			rst.w = rst[0].length;
			return rst;
		}
	}

抱歉!评论已关闭.