喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

$5.95 Web Hosting     

上一主题 下一主题
     
标题: 递归实现连连看寻路算法~  
 
kinpoo
注册会员
Rank: 2
初级会员



UID 30794
精华 0
积分 101
帖子 108
金钱 101 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2004-8-30
状态 离线
[广告]: 代充Paypal帐号美元
递归实现连连看寻路算法~

学习C++不是很久 多多指教~

<?php
/**
* Author:郭剑波(KINPOO)
* Last Modify:2005/11/21 13:40
* Purpose:find path for lian lian kan
*/

/**
* api:bool FindPath(int x1,int y1,int x2,int y2);
* config function FindPath,getKey by note
* path array:path[][2] in function FindPath
*/

#include<iostream>
using namespace std;
const 
int MX=14,MY=12;
int arr[MX][MY]=
    {
        {
0,0,0,0,0,0,0,1,1,1,0,1},
        {
5,0,0,0,0,0,0,0,0,0,0,0},
        {
0,0,0,0,0,0,0,1,11,12,100,0},
        {
1,0,4,4,0,0,9,0,0,0,0,0},
        {
0,0,2,0,3,0,0,0,0,0,0,0},
        {
3,0,0,0,0,8,0,0,0,0,0,0},
        {
0,0,0,0,0,0,0,0,0,0,0,0},
        {
0,0,0,7,0,0,0,1,1,0,0,0},
        {
0,1,0,1,0,1,0,6,0,0,0,0},
        {
0,1,0,1,0,0,0,0,0,0,0,0},
        {
0,0,0,0,0,0,0,0,0,0,0,0},
        {
0,0,0,0,0,0,0,0,0,0,0,0},
        {
0,1,1,1,0,1,0,0,0,0,0,0},
        {
0,1,1,1,0,0,0,0,0,0,0,0}
    };

void recordPath(int[][2],int,int);//for mazeOrder
void getKey(int,int,char,int[],int,int,int,int);//for mazeOrder
void mazeOrder(int,int,int,int,int[][2],int,int,bool*,char=0,int=0,int=-1,int=-1);//mazeOrder very important!!!
bool FindPath(int x1,int y1,int x2,int y2);//api

//测试用的~
void main(){
    
char p[5];
    
//cin>>p;
    //for(int i=0;i<1000;i++)
        
FindPath(4,3,0,1);
    
cin>>p;
}
//测试用的~

bool FindPath(int x1,int y1,int x2,int y2)
{
    
int i;
    const 
int MXX=MX,MYY=MY;//设置迷宫矩阵大小
    
int path[(MXX+MYY)*2][2];//用来存放路径的数组
    //其实最坏的情况下存放路径的数组大小为
    //(MXX>MYY ? MXX : MYY)*2 + (MXX<MYY ? MXX : MYY) - 2
    
bool is_con,iflock;//开始记录路径的开关
    
for(i=0;i<(MXX+MYY)*2;i++)
    {
//初始化数组为(-1,-1)... 必要
        
path[i][0]=path[i][1]=-1;//小于零即可
    
}
    
is_con=iflock=false;//初始化为false 非必要
    
mazeOrder(x1,y1,x2,y2,path,MXX,MYY,&iflock);//进行遍历迷宫并记录路径到path[][2]

    
if(path[0][0]>=0)
    {
//数组为不空
        
is_con=true;//设置返回值(连通)
    
}

    
//路径存放顺序:(x2,y2)->回溯->(x1,y1)
    //用-1代表数组结束

    //调试用的~
    
for(i=0;path[i][0]!=-1;i++)
        
cout<<path[i][0]<<"t"<<path[i][1]<<"n";
    
//调试用的~

    
return is_con;//返回是否连通
}

void recordPath(int path[][2],int x,int y)
{
    static 
int key;
    if(
path[0][0]<|| path[0][1]<0)
    {
//重新寻路时置零
        
key=0;
    }
    
path[key][0]=x;
    
path[key][1]=y;
    ++
key;
}

void getKey(int x,int y,char cway,int key[],int MXX,int MYY,int x2,int y2)
{
    switch(
cway)
    {
        case 
'N'key[0]=x-1;key[1]=y; break;
        case 
'E'key[0]=x;key[1]=y+1; break;
        case 
'S'key[0]=x+1;key[1]=y; break;
        case 
'W'key[0]=x;key[1]=y-1; break;
        default:break;
    }
    if(
key[0]<|| key[1]<|| key[0]>=MXX || key[1]>=MYY
        
|| ((key[0]!=x2 || key[1]!=y2) && arr[key[0]][key[1]]!=0))
                                        
//全局变量迷宫矩阵 arr
                                        //arr[key[0]][key[1]]!=0 0为无障碍物的标志
    
{//溢出 || (!=(x2,y2) && 障碍物)
        
key[0]=key[1]=-1;//小于零即可
    
}
}

void mazeOrder(int x1,int y1,int x2,int y2,int path[][2],int MXX,int MYY
                
,bool *iflock,char cway,int times,int x,int y)
{
    if(
times==|| (x1==x2 && y1==y2)//转折次数超过两次 || 开始==目标
                
|| x1<|| y1<|| x1>=MXX || y1>=MYY //开始点溢出
                
|| x2<|| y2<|| x2>=MXX || y2>=MYY//目标点溢出
    
{//可在此处直接加 arr[x1][y1]!=arr[x2][y2] 判断开始点与目标点是否想同
        
return;
    }
    if(
x<|| y<|| x>=MXX || y>=MYY)
    {
//初始化入口参数
        
x=x1;y=y1;cway=0;times=0;
    }
    if(
x==x2 && y==y2)
    {
//找到路径 加锁
        
*iflock=true;
    }

    
char *ways;//方向优先级
    
if(x2>=&& y2>y)       ways="ESWN";//+X轴加第四象限
    
else if(x2>&& y2<=y)  ways="SWNE";//-Y轴加第三象限
    
else if(x2<=&& y2<y)  ways="WNES";//-X轴加第二象限
    
else                    ways="NESW";//+Y轴加第一象限

    
for(int i=0,temp[2];ways[i]!=&& !(*iflock);i++)
    {
        switch(
cway)
        {
//不能直接回走
            
case 'N': if(ways[i]=='S') continue; break;
            case 
'E': if(ways[i]=='W') continue; break;
            case 
'S': if(ways[i]=='N') continue; break;
            case 
'W': if(ways[i]=='E') continue; break;
            default : break;
        }
        
getKey(x,y,ways[i],temp,MXX,MYY,x2,y2);//取得下一步的x,y
        
if(temp[0]>=0)
        {
//x,y有效时才继续往下走
            
mazeOrder(x1,y1,x2,y2,path,MXX,MYY,iflock,ways[i]
                        ,
times+((cway && ways[i]!=cway)?1:0)//转弯则加一
                        
,temp[0],temp[1]);
        }
    }
    if(*
iflock)
    {
//回滚时记录路径
        
recordPath(path,x,y);
    }
}
?>




矛盾是发展的源泉。
2005-12-27 08:20 PM#1
查看资料  访问主页  发短消息  ICQ 状态  顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.262760 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP