学_废了 2022-06-10 23:52 采纳率: 100%
浏览 16
已结题

这段函数如何进行封装?


#include<iostream>
#include<stack>
#include<stdio.h>
#include<time.h>
#include<string>
#include <stdlib.h>
using namespace std;
typedef struct
{
    int x,y;
}item;

typedef struct
{
    int x,y,d;
}Datetype;
typedef stack<Datetype> stack_int;
void path (int **maze,int,int,int,int);
void printpath();
#define NUM 100    //队列大小;
typedef struct{
    int x,y;  //所到点的坐标;
    int pre;  //前驱点的下标;
}SqType;  //队列;
int front,rear;  //队首指针与队尾指针;
void printpath(SqType sq[],int){//打印路径
    int i;
    i=rear; 
    do{
        cout<<"("<<sq[i].x<<","<<sq[i].y<<")<--";
        i=sq[i].pre;   //回溯;
    }while(i!=-1);
}
void restore(int **maze,int m,int n){//恢复迷宫
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(maze[i][j]==-1)
                maze[i][j]=0;
        }
    }
}
int path1(int **maze,int m,int n,int c,int d,int x1,int y1)//最短路径
{  //m,n为迷宫的长和宽,c,d为迷宫入口坐标,x1,y1为迷宫出口坐标;maze为迷宫;
    item move[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};  //坐标增量数组;
    SqType sq[NUM];
    int x,y,i,j,v;  
    front=rear=0;
    sq[0].x=c;
    sq[0].y=d;
    sq[0].pre=-1; 
    if(maze[c][d]==0)
       maze[c][d]=-1;//入口点入队;
    else goto G;
    while(front<=rear){     //队列不为空
        x=sq[front].x;
        y=sq[front].y;
        for(v=0;v<8;v++){
            i=x+move[v].x;
            j=y+move[v].y;
            if(maze[i][j]==0){
                rear++;
                sq[rear].x=i;
                sq[rear].y=j;
                sq[rear].pre=front;
                maze[i][j]=-1; //访问过的坐标点,入队;
            }
            if(i==x1&&j==y1){
                cout<<"最短路径为:"<<endl;
                printpath(sq,rear);  //输出路径;
                restore(maze,m,n);    //恢复迷宫;
                return 1; 
            }
            }   //for v;
            front++;   //当前点搜索完,取下一个点搜索
        }   //while
G:cout<<"无路径。"<<endl;
        return 0;
    }
void path(int **maze,int a,int b,int m,int n)
{
    item move[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
    stack_int st;
    Datetype temp;
    int x,y,d,i,j;
    if(maze[a][b]==1){cout<<"进口输入有误。";return;}
    temp.x=a;temp.y=b;temp.d=-1; //初始化入口点坐标及方向;
    st.push(temp);
    while(!st.empty())
    {
        temp=st.top();
        st.pop();
        x=temp.x;y=temp.y;d=temp.d+1;
        while(d<8)
        {
            i=x+move[d].x;j=y+move[d].y;
            if(maze[i][j]==0)  //该点可到达;
            {
                temp.x=x;temp.y=y;temp.d=d; //坐标及方向;
                st.push(temp); //坐标及方向入栈;
                x=i;y=j;
                maze[x][y]=-1;//到达新点;
                if(x==m && y==n)
                {
                    cout<<" 迷宫路径为:"<<endl;
                    cout<<"("<<m<<","<<n<<")<---";
                    Datetype t;
                    while(!st.empty())
                    {
                        t=st.top();
                        cout<<"("<<t.x<<","<<t.y<<")<---";
                        st.pop();
                    }    //输出路径;
                    cout<<endl;
                    return ;  //到达出口;
                }
                else d=0;   //重新初始化方向;
            }
            else d++;    //改变方向;
        }
    }
    cout<<"对不起,无法找到出口.";
    return;   //迷宫无路;
}
                    
void printpath()
{
    int m,n,i,j,l,c,d;
    string s;
    cout<<" 请输入迷宫的行数列数如:(m n)"<<endl;
    cin>>m>>n;
    int **maze=new int*[m+2];
    for(i=0;i<=m+1;i++)
        maze[i]=new int[n+2];//申请迷宫的空间;
    for(i=0;i<=m+1;i++)   
        maze[i][0]=1;
    for(i=0;i<=n+1;i++)
        maze[0][i]=1;
    for(i=0;i<=m+1;i++)
        maze[i][n+1]=1;
    for(i=0;i<=n+1;i++)
        maze[m+1][i]=1;  //建立迷宫周围的墙;
    cout<<"1、采用创建好的迷宫; 2、自己创建迷宫(其他输入按'2'处理)"<<endl;
    cin>>s;
    if(s=="1")
    {
        srand(time(0));  //系统时间随机函数;
        for(i=1;i<=m;i++)
            for(j=1;j<=n;j++)
                maze[i][j]=rand()%2;  //随机赋值
        maze[1][1]=0;   //(1,1)点为可通过点;
        maze[m][n]=0;   //(m,n)点为可通过点;
    }
    else 
    {
        cout<<"请输入迷宫:"<<m<<"行"<<n<<"列"<<", 输入必须为'0' 或 '1';"<<endl;
        for(i=1;i<=m;i++)     //输入第i行迷宫的构造;
            for(j=1;j<=n;j++)     //输入第j列迷宫的结构;
            {
                cin>>maze[i][j];
              A:if(maze[i][j]!=0 && maze[i][j]!=1)
                {
                    cout<<"请再次输入:";
                    cin>>maze[i][j];goto A;  //判错;
                }
            }    
    }
    cout<<"迷宫如下:"<<endl; //显示用户输入的迷宫;
            for(i=0;i<=m+1;i++)
            {
                for(j=0;j<=n+1;j++)
                 cout<<maze[i][j]<<" ";
                cout<<endl;
            }
          H:cout<<"请输入迷宫入口(a,b),出口(c,d):";
            cin>>i>>j>>c>>d;
    path(maze,i,j,c,d);    //调用路径函数,输出路径;
    cout<<endl;  //格式设置;
    restore(maze,m,n);   //恢复迷宫;
    path1(maze,m,n,i,j,c,d);  //输出最短路径;
    cout<<endl;  //格式设置;
    cout<<"1、寻找其他入口与出口;2、退出此迷宫;";
    cin>>l;  
    if(l==1){
        restore(maze,m,n);  //恢复迷宫;
        goto H;
    }
    else return;   //跳出此函数;
}
int main()
{
    string s="Y";
    do
    {
        cout<<"--------------------------欢迎到达迷宫界面--------------------------\n";
        printpath();
        cout<<endl;
        cout<<"\n 是否继续?'Y' 或'N'(输入其他操作按'N')"<<endl;
        cin>>s;
    }while (s=="Y"||s=="y");
    system("pause");
}
  • 写回答

1条回答 默认 最新

  • 昂格莱德 2022-06-11 08:43
    关注

    封装?你要封装成类吗,如果是,那可能绝大部分代码需要重构,因为你这是面向过程的代码

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月19日
  • 已采纳回答 6月11日
  • 创建了问题 6月10日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么