回 帖 发 新 帖 刷新版面

主题:求教

#include<iostream>
using namespace std;

int maze[10][10]=
{
    {2,2,2,2,2,2,2,2,2,2},
    {2,0,0,2,0,0,0,2,0,2},
    {2,0,0,2,0,0,0,2,0,2},
    {2,0,0,0,0,2,2,0,0,2},
    {2,0,2,2,2,0,0,0,0,2},
    {2,0,0,0,2,0,0,0,0,2},
    {2,0,2,0,0,0,2,0,0,2},
    {2,0,2,2,2,0,2,2,0,2},
    {2,2,0,0,0,0,0,0,0,2},
    {2,2,2,2,2,2,2,2,2,2},
};

int *s=new int[200];

void display(int);

void search(int i,int j)
{
    int t;
    t=0;
    maze[i][j]=1;
    s[t++]=i;
    s[t++]=j;
    while(1) //走过的地方赋值为1
    {
        if(maze[1][1]!=0 && maze[1][2]!=0 && maze[1][4]!=0 && maze[1][5]!=0 && maze[1][6]!=0 && maze[1][8]!=0 && maze[2][1]!=0 && maze[2][2]!=0 && maze[2][4]!=0 && maze[2][5]!=0 && maze[2][6]!=0 && maze[2][8]!=0&& maze[3][1]!=0&& maze[3][2]!=0&& maze[3][3]!=0&& maze[3][4]!=0&& maze[3][7]!=0&& maze[3][8]!=0&& maze[4][1]!=0&& maze[4][5]!=0&& maze[4][6]!=0&& maze[4][7]!=0&& maze[4][8]!=0&& maze[5][1]!=0&& maze[5][2]!=0&& maze[5][3]!=0&& maze[5][4]!=0&& maze[5][5]!=0&& maze[5][6]!=0&& maze[5][7]!=0&& maze[5][8]!=0&& maze[6][1]!=0&& maze[6][3]!=0&& maze[6][4]!=0&& maze[6][5]!=0&& maze[6][6]!=0&& maze[6][7]!=0&& maze[6][8]!=0&& maze[7][1]!=0&& maze[7][5]!=0&& maze[7][6]!=0&& maze[7][7]!=0&& maze[7][8]!=0&& maze[8][1]!=0&& maze[8][2]!=0&& maze[8][3]!=0&& maze[8][4]!=0&& maze[8][5]!=0&& maze[8][6]!=0&& maze[8][7]!=0)
        {
            break;
        }
        if(maze[i+1][j]==0||maze[i+1][j]==4)//下
        {
            if(((i+1)==8)&&j==8)
            {
                display(t);
                t=t-2;
                j=s[t-1];
                i=s[t-2];
                continue;
            }
            else
            {
                s[t++]=i+1;
                s[t++]=j;
                maze[i+1][j]=1;
            }
        }    
        else if(maze[i][j+1]==0||maze[i][j+1]==4)   //右
        {
            if(i==8&&((j+1)==8))
            {
                display(t);
                t=t-2;
                j=s[t-1];
                i=s[t-2];
                continue;
            }
            else
            {
                s[t++]=i;
                s[t++]=j+1;
                maze[i][j+1]=1;
            }
        }
        else if(maze[i][j-1]==0||maze[i][j-1]==4) //左
        {
            if(i==8&&((j-1)==8))
            {
                display(t);
                t=t-2;
                j=s[t-1];
                i=s[t-2];
                continue;
            }
            else
            {
                s[t++]=i;
                s[t++]=j-1;
                maze[i][j-1]=1;
            }
        }
        
        
        else if(maze[i-1][j]==0||maze[i-1][j]==4)//上
        {
            if(((i-1)==8)&&j==8)
            {
                display(t);
                t=t-2;
                j=s[t-1];
                i=s[t-2];
                continue;
            }
            else
            {
                s[t++]=i-1;
                s[t++]=j;
                maze[i-1][j]=1;
            }
        }
        
        
        
        
        else
        {
            maze[i][j]=3;
            t=t-2;
        }
        
        j=s[t-1];
        i=s[t-2];
            
        
        
    }
    
    return ;
}

void display(int t)
{
    int a,b,r,c,i,j;
    int x[100],y[100];
    for(i=0,r=0;i<t;r++)
    {
        x[r]=s[i];
        i=i+2;
    }
    for(j=1,c=0;j<t;c++)
    {
        y[c]=s[j];
        j=j+2;
    }
    cout<<"一条路径:  ";
    for(a=0,b=0;a<r,b<c;a++,b++)
    {
        cout<<"("<<x[a]<<","<<y[b]<<")---";
    }
    cout<<"(8,8)"<<endl;
}

void disp(){
    for(int i=0;i<10;i++)
    {  
        cout<<endl;
       for(int j=0;j<10;j++)
         cout<<maze[i][j]<<",";
    }
       cout<<endl; 
}

void main()
{
    cout<<"原迷宫:"<<endl;
    disp();
    cout<<endl;
    
    search(1,1);
    disp();

    char cc;
    cout<<"请exit"<<endl;
    cin>>cc;
}


要把这里的路径全部找出来要怎么改?






回复列表 (共2个回复)

沙发

迷宫的调试跟踪很费神,所以没有仔细看你的代码。我以前做过类似的迷宫(C语言),应该大同小异,你看看是否可以参考:

[code=c]
#include <stdio.h>                    
                    
/************************************************************************                    
  打印迷宫。将int改成字符打印,以兼容"*"路径打印。                    
************************************************************************/                    
                    
void print_maze(int a[][10])        // 如纵向显示不完可设DOS为窗口模式            
{                    
    static int intFind;                // 记录找到多少个方案
    int x, y;                
    printf("Option %d:\n", ++intFind);                
    for (x=0; x<10; ++x)                
    {                
        for (y=0; y<10; ++y)            
            printf("%c ", a[x][y]+'0');        
        printf("\n");            
    }                
    printf("\n");                
}                    
                    
/************************************************************************                    
  寻路的递归求解,用"*"来标示路径。                    
************************************************************************/                    
                    
void find_road(int b[][10], int x, int y)                    
{                    
    int a[10][10], i, j;                
                    
    if ( x<0 || y<0 || x==10 || y==10 ||                
       ( b[x][y]!=0 && b[x][y]!=2 ) )                
        return;            
                    
    if (b[x][y]==2)                
    {                
        print_maze(b);            
        return;            
    }                
                    
    for (i=0; i<10; ++i)    // 要保留原值,所以只能在复制品上改            
        for (j=0; j<10; ++j)            
            a[i][j] = b[i][j];        
                    
    a[x][y] = '*' - '0';        // 标示路径        
    find_road(a, x-1, y);        // 上行        
    find_road(a, x+1, y);        // 下行        
    find_road(a, x, y-1);        // 左行        
    find_road(a, x, y+1);        // 右行        
}                    
                    
int main()                    
{                    
    int a[10][10] =    {            // 迷宫1,1表墙,0表路,2表出口,进口a[0][1]    
        1, 0, 1, 1, 1, 1, 1, 1, 1, 1,                              
        1, 0, 0, 1, 0, 0, 0, 1, 0, 1,                     
        1, 0, 0, 0, 0, 1, 1, 0, 1, 1,                     
        1, 0, 1, 1, 1, 0, 0, 1, 0, 1,                     
        1, 0, 0, 0, 1, 0, 0, 0, 0, 1,                     
        1, 0, 1, 0, 0, 0, 1, 0, 1, 1,                     
        1, 0, 1, 1, 1, 1, 0, 0, 1, 1,                     
        1, 1, 1, 0, 0, 0, 1, 0, 1, 1,                     
        1, 1, 1, 0, 0, 0, 0, 0, 0, 2,                     
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };                    
                    
    int b[10][10] =    {            // 迷宫2,1表墙,0表路,2表出口,进口b[0][0]    
        0, 1, 1, 1, 0, 0, 1, 0, 0, 1,             
        0, 0, 0, 0, 0, 1, 1, 1, 1, 1,             
        1, 1, 0, 1, 0, 1, 1, 1, 1, 1,             
        0, 0, 0, 0, 1, 0, 0, 0, 1, 1,             
        0, 1, 0, 1, 0, 1, 1, 1, 1, 1,             
        0, 0, 0, 1, 0, 1, 1, 1, 1, 1,             
        0, 0, 0, 1, 0, 0, 0, 1, 1, 1,             
        1, 1, 0, 1, 0, 1, 1, 1, 1, 1,             
        0, 0, 0, 0, 0, 1, 1, 1, 1, 1,             
        1, 1, 1, 1, 0, 0, 0, 0, 0, 2 };                
                    
                    
    a[0][1] = '*' - '0';                
    find_road(a, 1, 1);            //其它几个方向明知不行,不试也罢    
                    
    b[0][0] = '*' - '0';                
    find_road(b, 1, 0);                
                    
    return 0;                
}                    
[/code]

板凳

谢谢

我来回复

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