回 帖 发 新 帖 刷新版面

主题:小弟的迷宫问题写了近两天,大家来运行看看,很好玩的,进来欣赏的人一律给分

//==================================迷宫问题(又称电路板问题)===============================
#include<iomanip.h>
#include<fstream.h>
//=========================================类声明==============================
template <class T> class queue;
template <class T>
class node
{
    friend class queue<T> ;
    private:
        T data;
        node<T>  * next;
};
//----------
template <class T>
class queue
{
    public:
        queue(){front=rear=NULL;}
        ~queue();
        void enqueue(T a);
        bool dequeue(T& savedeq);
        bool empty();
        
    private:
        node<T> * front;
        node<T> * rear;
};
//----------
class position
{
public:
    int row;
    int col;
};
//==============================================类函数声明=================================
template<class T>
queue<T>::~queue()
{
    node<T>* p;
    for(int i=0;front;i++)
    {
        p=front;
        front=front->next;
        delete p;
    }
}
//----------
template<class T>
bool queue<T>::empty()
{
    return front==NULL;
}
//----------
template<class T>
void queue<T>::enqueue(T a)
{
    node<T> * p=new node<T>;
    p->data=a;
    p->next=NULL;
    if(front==NULL&&rear==NULL)
    {
        rear=front=p;
    }
    else
    {
        rear->next=p;
        rear=p;
    }
}
//----------
template<class T>
bool queue<T>::dequeue(T& savedeq)
{
    if(front==NULL&&rear==NULL)
        return 0;
    node<T> * p=front;
    front=front->next;
    savedeq=p->data;
    if(front==NULL)
        rear=NULL;
    delete p;
    return 1;
}
//============================================主程序====================================
void main()
{
    //-------------------------------------初始化迷宫--------------------------------
    
    cout<<"请在文本中输入迷宫方阵.(障碍物用x表示,可通行路径用0表示满意)每行结尾用'.'标识"<<endl;
    cout<<"结束后按任意键继续:"<<endl;
    char wait;
    cin>>wait;
lb: ifstream fin1,fin2;                                                //对象声明
    cout<<"输入文件路径:";                                             //文件路径指定
    char * road=new char [30];
    cin>>road;
    fin1.open(road,ios::in|ios::out|ios::nocreate);                    //打开文件
    if(!fin1)                                                          //文件不存在处理
    {
        cout<<"无此文件"<<endl;
        fin1.close();
        goto lb;
    }
    char g;
    int han=0,lie=0;
    while(fin1>>g)
    {
        if(g=='.')
            ++han;
        if(han==0)
            lie++;
    }
    fin1.close();
    fin2.open(road);
    int ** p=new int* [han+2];
    for(int i=0;i<=han+1;i++)
        p[i]=new int[lie+2];
    
    for(i=0;i<=han+1;i++)
    {
        p[i][0]=-1;
        p[i][lie+1]=-1;
    }
    for(int j=0;j<=lie+1;j++)
    {
        p[0][j]=-1;
        p[han+1][j]=-1;
    }
    for(i=1;i<=han;i++)
        for(j=1;j<=lie+1;j++)
            if(fin2>>g&&g!='.')
            {
                if(g=='0')
                p[i][j]=0;
                if(g=='x')
                p[i][j]=-1;
                
            }
    fin2.close();
    cout<<endl;
    cout<<"你输入的迷宫是:"<<endl;
    cout<<endl;
    for(i=1;i<=han;i++)
    {
        for(j=1;j<=lie;j++)
            cout<<setw(3)<<p[i][j];
        cout<<endl;
        cout<<endl;
    }
    //----------
    int h1,l1,h2,l2;                                                   // 入口出口设置
    cout<<"入口的行:";
    cin>>h1;
    cout<<"入口的列:";
    cin>>l1;
    cout<<"出口的行:";
    cin>>h2;
    cout<<"出口的列:";
    cin>>l2;
    position start,finish;
    start.row=h1;
    start.col=l1;
    finish.row=h2;
    finish.col=l2;
    //----------
    position offset[4];                                                //辅助移动对象
    offset[0].row=0;
    offset[0].col=1;
    offset[1].row=1;
    offset[1].col=0;
    offset[2].row=0;
    offset[2].col=-1;
    offset[3].row=-1;
    offset[3].col=0;
    //----------
    int length;                                                        //变量声明
    position here,nb;
    //----------
    here.row=start.row;                                                //寻找出口程序
    here.col=start.col;
    queue<position> assist;
    while(true)
    {
        for(i=0;i<4;i++)
        {
            nb.row=here.row+offset[i].row;
            nb.col=here.col+offset[i].col;
            if(p[nb.row][nb.col]==0)
            {
                p[nb.row][nb.col]=p[here.row][here.col]+1;
                if(nb.row==finish.row&&nb.col==finish.col)
                    break;
                assist.enqueue(nb);
            }
        }
        if(nb.row==finish.row&&nb.col==finish.col)
        break;
        if(assist.empty())
        {
            cout<<"不存在通往出口的路"<<endl;
            char x;
            cin>>x;
            return;
        }
        assist.dequeue(here);
    }
    //----------
    length=p[finish.row][finish.col];                                  //回溯入口
    cout<<endl;
    cout<<"出口到入口的长度是"<<length<<endl;
    here.row=finish.row;
    here.col=finish.col;

    for(i=length;i>=2;i--)
    {
        for(j=0;j<4;j++)
        {
            nb.row=here.row+offset[j].row;
            nb.col=here.col+offset[j].col;
            if(p[nb.row][nb.col]==i-1)
                break;
        }
        p[nb.row][nb.col]=-2;
        here.row=nb.row;
        here.col=nb.col;
    
    }
    //-----------
    char ** result=new char* [han+2];                                  //二维数组转字符型
    for(i=0;i<=han+1;i++)
        result[i]=new char[lie+2];
    for(i=1;i<=han;i++)                 
    {
        for(j=1;j<=lie;j++)
        {
            if(p[i][j]==-2)
                result[i][j]='*';
            else
                if(i==h1&&j==l1)
                result[i][j]='a';
                else
                    if(i==h2&&j==l2)
                    result[i][j]='z';
                    else
                        if(p[i][j]==-1)
                            result[i][j]='#';
                        else
                            result[i][j]='_';
        }
    }
    //-----------
    ofstream fout;                                                     //迷宫输出到文本中
    fout.open(road,ios::app);
    fout<<endl;
    fout<<"以下是迷宫路线:"<<endl;
    fout<<endl;
    for(i=1;i<=han;i++)               
    {
        for(j=1;j<=lie;j++)
            fout<<setw(3)<<result[i][j];
        fout<<endl;
        fout<<endl;
    }
    fout<<"(入口 a 出口 z 路径 * 可通行路径 _ 障碍物 #)"<<endl;
    fout.close();
    cout<<endl;
    cout<<"结果已保存到"<<road<<endl;
    char z;
    cin>>z;
}









    


[em3]

回复列表 (共39个回复)

21 楼

是C吗?

22 楼

写的确实很棒

23 楼

不错啊

24 楼

厉害厉害,谢谢你,多发此贴,真棒哦!!!

25 楼

厉害厉害,好棒,继续努力!!!

26 楼

楼主厉害啊~不过我还是看不懂程序源代码

27 楼

下下来,回去看一看
用了C++的,本人数据结构学的也是C++版的,一定要顶

28 楼

怎么随机生成啊。。。
我也在写,就是不知道怎么随机生成只有一条通路的迷宫,愁啊。。。

29 楼

顶你一下!!!!!!!!!!!!!!!!!!

30 楼

楼主比较有才,代码写的也很规范,结构清晰便于阅读。

但是也有不少问题啊
楼主用的是九几年的语法吧?要注意与时俱进。

楼主要注意的几个问题

1、主函数的返回值,很有意义。
返回0表示程序成功执行完成,否则会被操作系统认为执行不成功,很可能在日志中记录错误

2、C++标准中规定for循环中的定义的变量作用域只在局部
对于多次使用的循环控制标记,在程序一开首定义,每次使用时初始化;比在局部定义效率高

3、对于使用动态内存分配的类,要注意类的安全,要提供复制构造函数
4、不要过分对象化,不要什么东西都封装为类
class position
{
public:
    int row;
    int col;
};
这种可用结构体代替
过分对象化,是降低程序效率的好手

5、在写类前,看看标准库和其它易于获得库中又有没有类已经提供的你所需要的功能,重用代码很重要

我来回复

您尚未登录,请登录后再回复。点此登录或注册