一个简单的网格算法

原创 2007年09月29日 02:43:00

/*
问题描述]:
  *        任意给定一个正方形,将正方形的各边做n等分,并将相应各点连接成水平
  *        或垂直的直线,如果从正方形的左下角(0,0)出发,沿各边线或连接线,
  *        自左向右或自下而上的方向,到达正方形的右上角(n,n),
  *        请用JAVA程序计算并输出所有可能的路径总数和具体线路.
  *        请提供相关JAVA源程序和n=2,3,4时的输出结果。输出结果按以下方式:
  *        以n=1为例:
  *          n = 1
  *          Path1: (0,0) - (0,1) - (1,1)
  *          Path2: (0,0) - (1,0) - (1,1)
  *          Total = 2
*/ 

这是我在前几天从网上看到的一个问题, 作者已经给出了答案, 这里给出一个新的。

首先定义一个Point类

 

public class Point ...{
    
    
public int x;
    
public int y;
    
    
public Point(int x, int y)...{
        
this.x = x;
        
this.y = y;
    }

    
    
public String toString()...{
        
return "("++ "," + y + ")";
    }

}

 

然后我们定义一个Grid类, 那的主要功能就是判断一个给定的point是否包含在一个Grid中。

 

public class Grid ...{
    
    
private final int origin_x = 0;
    
private final int origin_y = 0;
    
private int n;
    
private int max_x;
    
private int max_y;
    
    
public Grid(int n)...{
        setN(n);
    }

    
    
public boolean isExist(int x, int y)...{
        
if(x >= origin_x && 
           y 
>= origin_y && 
           x 
<= max_x && 
           y 
<= max_y)
            
return true;
        
return false;
    }

    
    
public void setN(int n)...{
        
this.n = n;
        max_x 
= n;
        max_y 
= n;
    }

    
    
public int getN()...{
        
return n;
    }

    
    
public int getOrigin_x()...{
        
return origin_x;
    }

    
    
public int getOrigin_y()...{
        
return origin_y;
    }

    
    
}

 

为了管理得到的路径, 也就是Path, 这里再定义一个Path类, 其主要功能类似一个Stack

 

import java.util.ArrayList;

public class Path...{

    
private ArrayList<Point> points;

    
public Path() ...{
        points 
= new ArrayList<Point>();
    }


    
public void setPoints(ArrayList<Point> points) ...{
        
this.points = points;
    }


    
public ArrayList<Point> getPoints() ...{
        
return points;
    }


    
public void push(Point p) ...{
        points.add(p);
    }


    
public void pop() ...{
        
if (!points.isEmpty()) ...{
            points.remove(points.size() 
- 1);
        }

    }

    
public String toString() ...{
        StringBuffer sb 
= new StringBuffer();
        
if (!points.isEmpty()) ...{
            sb.append(points.get(
0).toString());
            
for (int i = 1; i < points.size(); i++...{
                sb.append(
"-");
                sb.append(points.get(i));
            }

        }

        
return sb.toString();
    }


}

 

最后一个是主类, 负责找到可能的Path

 

public class GridPathFinder ...{
    
    
private Grid grid;
    
private Path path;
    
private int counter;
    
    
public GridPathFinder(Grid grid)...{
        setGrid(grid);
        
this.path = new Path();
    }

    
    
public void find()...{
        System.out.println(
"n = " + grid.getN());
        counter 
= 0;
        Point origin 
= new Point(grid.getOrigin_x(), grid.getOrigin_y());
        findPath(origin);
        System.out.println(
"Total : " + counter);
    }

    
    
private void findPath(Point point)...{
        path.push(point);
        
int count = getPathCount(point);
        
if(count == 0)...{
            System.out.println(
"Path" + ++counter + " : " + path);
            path.pop();
            
return;
        }

        
if(isUpAvaliable(point))...{
            findPath(getNextUpPoint(point));
        }

        
if(isRightAvaliable(point))...{
            findPath(getNextRightPoint(point));
        }

        path.pop();
    }

    
    
public void setGrid(Grid grid)...{
        
this.grid = grid;
        
if(this.grid == null)...{
            
this.grid = new Grid(1);
        }

    }

    
    
private int getPathCount(Point point)...{
        
int count = 0;
        
if(isUpAvaliable(point))
            count
++;
        
if(isRightAvaliable(point))
            count
++;
        
return count;
    }

    
    
private Point getNextUpPoint(Point point)...{
        Point p
= new Point(point.x, point.y + 1);
        
return p;
    }

    
    
private Point getNextRightPoint(Point point)...{
        
return new Point(point.x + 1, point.y);
    }

    
    
private boolean isUpAvaliable(Point point)...{
        
return grid.isExist(point.x, point.y+1);
    }

    
    
private boolean isRightAvaliable(Point point)...{
        
return grid.isExist(point.x+1, point.y);
    }


    
public static void main(String[] args)...{
        GridPathFinder gpf 
= new GridPathFinder(new Grid(3));
        gpf.find();
    }

}

GIS 网格索引算法

GIS网格索引算法 在上面的几篇文章中,简单的介绍了GIS系统中的网格索引,本文将简单的介绍GIS网格索引的算法步骤。 (1)创建:通过数据的统计特征计算出一个网格尺度,对每一个实体按网格...
  • tiandd12
  • tiandd12
  • 2016年11月21日 15:49
  • 1315

三角网格的主要生成方法

1、  网格前沿算法(Advancing Front Method) 又称启发式的网格生成算法。算法思路是以剖分域的边界为网格的初始前沿,按默认网格单元的形状、尺度等要求向域内生成节点、连接单元,同时...
  • Chinamming
  • Chinamming
  • 2013年11月22日 00:07
  • 2893

COPY 一种接近最优的导航网格生成算法以及基于导航网格的寻路算法

提出背景: 长距离寻路会出现掉帧现象,为了提高寻路速度,并为3D环境中的寻路方案提供基础算法实现。   目前状况: 由于3D游戏对帧率要求很高,而在游戏中进行一次长距离的寻路可能要花费8-10...
  • lienen
  • lienen
  • 2014年12月31日 11:19
  • 1676

网格简化

实验目的 实现边坍塌的网格简化方法。 实验内容 我实现了Surface Simplification Using Quadric Error Metrics(下面称为Quadric)及...
  • xuexiaokkk
  • xuexiaokkk
  • 2015年10月30日 16:24
  • 1155

六边形网格快速定位

转载自:http://www.thecodeway.com/blog/?p=1811&cpage=1#comment-4012     在游戏中,一般使用正方形网格管理二维场景中的各种物体,...
  • yang3wei
  • yang3wei
  • 2012年06月29日 23:59
  • 3028

基于3D表面网格的切割算法

基于3D表面网格的切割算法    本文主要讲的内容有四个部分:(1)引言,介绍虚拟切割算法的相关内容;(2)最长边细化算法,主要是为切割算法做铺垫,使网格足够细化后再进行切割,从而使切割路径更光滑;...
  • woailvmengmeng
  • woailvmengmeng
  • 2013年10月12日 15:26
  • 1875

数模算法-网格算法和穷举法

网格算法和穷举法一样,只是网格法是连续问题的穷举。 比如要求在 N 个变量情况下的最优化问题,那么对这些变量可取的空间进行采点, 比如在 [ a; b ] 区间内取 M +1 个点,就是 a; a...
  • mmx1065009116
  • mmx1065009116
  • 2017年09月03日 00:00
  • 584

三维网格精简算法(Quadric Error Metrics)附源码(二)

最近在研究网格简化,之前转载的一篇博文利用的是QEM度量误差进行网格简化,具体的算法在三维网格精简算法(Quadric Error Metrics)附源码(一)一文中说明的已经很清楚了。 在上一篇博文...
  • lafengxiaoyu
  • lafengxiaoyu
  • 2017年10月06日 16:57
  • 356

基于重新划分的三角形网格简化的一种改进算法

周 昆 马小虎 潘志庚 石教英 (浙江大学CAD&CG国家重点实验室 杭州 310027) 摘要 基于重新划分的三角形网格简化方法能自动生成多细节层次模型,它的基本思想是:根据三角形网格的...
  • pizi0475
  • pizi0475
  • 2012年10月01日 08:43
  • 3376

[OpenGL] 网格细分算法 Loop Subdivision - 附我的实现结果

【更新】 我的新博客:www.ryuzhihao.cc,当然这个CSDN也会更新。                本文在新博客的链接:点击打开链接 时间:2017年8月25日 一、写在前面 ...
  • Mahabharata_
  • Mahabharata_
  • 2017年08月26日 10:45
  • 1334
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个简单的网格算法
举报原因:
原因补充:

(最多只允许输入30个字)