循环时不能退出

时间:2016-10-31 07:59:52

标签: c loops break infinite

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int i=0,j=0,direction=0,k=0,l=0,ix=0,jx=0,mov0=1,mov1=1,mov2=1,mov3=1;
    char cl='B';

    printf("Enter the size of the maze: ");
    scanf("%d %d",&i,&j);
    char maze[i][j];

    for(l=0;l<j;l++)
    {
        for(k=0;k<i;k++)
        {
            maze[k][l]='.';
        }
    }

    i=0;
    j=0;
    maze[i][j]='A';
    //maze[0][0]='A';
    srand(time(NULL));
    //starts moving through maze
    /*for(jx=0;jx<l;jx++)
    {
        for(ix=0;ix<k;ix++)
        {
            printf("[%c]",maze[ix][jx]);
        }
        printf("\n");
    }*/


    while  ((mov0!=1 && mov1!=1 && mov2!=1 && mov3!=1) || (cl!='Z'+1 ) )
    {
        /*//reset space(positions above 1)
        spaces=1;*/
        //generates direction
            direction=rand()%4;
            printf("%c %d\n",cl,direction);
            /*for(jx=0;jx<l;jx++)
                            {
                                for(ix=0;ix<k;ix++)
                                {
                                printf("[%c]",maze[ix][jx]);
                                }
                                printf("\n");
                            }*/
            switch(direction)
            {
                //up
                case 0: if((j-1)>0 && maze[i][j-1]=='.' && mov0==1)
                            {
                                maze[i][j-1]=cl;
                                cl++;
                                j--;
                            } else {
                                mov0=0;
                                break;
                            }

                            break;
                //down
                case 1: if((j+1)<l && (maze[i][j+1]=='.' && mov1==1))
                            {
                                maze[i][j+1]=cl;
                                cl++;
                                j++;
                            } else {
                                mov1=0;
                                break;
                            }

                             break;
                //left
                case 2: if((i-1)>0 && (maze[i-1][j]=='.' && mov2==1))
                            {
                                maze[i-1][j]=cl;
                                cl++;
                                i--;
                            } else {
                                mov2=0;
                                break;
                            }

                            break;
                //right
                case 3: if((i+1)<k && (maze[i+1][j]=='.' && mov3==1))
                            {
                                maze[i+1][j]=cl;
                                cl++;
                                i++;
                            } else {
                                mov3=0;
                                break;
                            }

                            break;

            }

    }
    for(j=0;j<l;j++)
    {
        for(i=0;i<k;i++)
        {
            printf("[%c]",maze[i][j]);
        }
        printf("\n");
    }

    return 0;
}

这段代码应该遍历一个数组,并用字母表中的字母填充每个点,如果没有可用的点,它必须退出并按原样打印数组。 (不能两次去同一个细胞)。

编辑#2:

我也尝试过这种方式:

switch(direction)
        {
            //up
            case 0: if((j-1)>0 && maze[i][j-1]=='.')
                        {
                            maze[i][j-1]=cl;
                            cl++;
                            j--;
                        } else if((maze[i+1][j]!='.') && (maze[i-1][j]!='.') && (maze[i][j-1]!='.') && (maze[i][j+1]!='.')){

                            flag=0;
                            break;
                        }

                        break;
            //down
            case 1: if((j+1)<l && (maze[i][j+1]=='.'))
                        {
                            maze[i][j+1]=cl;
                            cl++;
                            j++;
                        } else if((maze[i+1][j]!='.') && (maze[i-1][j]!='.') && (maze[i][j-1]!='.') && (maze[i][j+1]!='.')){

                            flag=0;
                            break;
                        }

                         break;
            //left
            case 2: if((i-1)>0 && (maze[i-1][j]=='.'))
                        {
                            maze[i-1][j]=cl;
                            cl++;
                            i--;
                        } else if((maze[i+1][j]!='.') && (maze[i-1][j]!='.') && (maze[i][j-1]!='.') && (maze[i][j+1]!='.')){

                            flag=0;
                            break;
                        }

                        break;
            //right
            case 3: if((i+1)<k && (maze[i+1][j]=='.'))
                        {
                            maze[i+1][j]=cl;
                            cl++;
                            i++;
                        } else if((maze[i+1][j]!='.') && (maze[i-1][j]!='.') && (maze[i][j-1]!='.') && (maze[i][j+1]!='.')){

                            flag=0;
                            break;
                        }

                        break;

        }

}

flag变量替换所有4个mov#变量。循环时仍未退出。

编辑#3修复了@SomeProgrammerDude指出的内容。仍然没有退出。

1 个答案:

答案 0 :(得分:0)

    while  ((mov0!=1 && mov1!=1 && mov2!=1 && mov3!=1) || (cl!='Z'+1 ) )

应该是

    while  ((mov0!=1 && mov1!=1 && mov2!=1 && mov3!=1) && (cl!='Z'+1 ) )