• 关于《算法设计》走迷宫问题之创建迷宫的优化


      最近在浏览自己的博客时发现之前发布的走迷宫问题中,在创建迷宫数组模块可能会导致时间消耗较大。所以就想了一下如何优化的问题。之前的代码如下:

     1 void creat_arr(int a[][N])   //创建迷宫数组
     2 {
     3     int i,j,x,y,tem,m=0,k[100];
     4     bool flag;
     5     srand(time(0));
     6     for(i=0;i<N;i++)
     7         for(j=0;j<N;j++)
     8             a[i][j]=2;
     9     for(i=0;i<(N-2)*(N-2)*(0.9-0.4*M);i++)  //当难度系数为0.5时,空格数占0.7;当难度系数为1时,空格数占0.5
    10     {
    11         flag=false;
    12         x=rand()%(N-2)+1;
    13         y=rand()%(N-2)+1;
    14         tem=x*10+y;
    15         for(j=0;j<m;j++)
    16         {
    17             if(tem==k[j])
    18             {
    19                 flag=true;
    20                 break;
    21             }
    22         }
    23         if(flag)
    24         {
    25             i--;
    26         }
    27         else
    28         {
    29             k[m++]=tem;
    30             a[x][y]=0;
    31         }
    32     }    
    33 }

    我们可以看一下上面的代码,可能会导致的问题是:当数组k[]中数据足够多时,由于x,y不确定性,可能会使tem命中率大幅下降,从而拖慢了整个代码的运行。那么如何使随机数据确定化呢?我想到的是将上面的过程反过来,我们先产生随机的两位数,然后将其分解为x,y。这样有一个好处是,我们可以先不考虑二维数组的创建,将主要的思路集中在生成随机两位数上。换句换说,我们只需将确定的两位数打乱,然后选取其中的多少个做为空格数即可。
    下面是优化过后的代码:

     1 void creat_arr(int a[][N])   //创建迷宫数组
     2 {
     3     int i,j,x,y;
     4     int tem[(N-2)*(N-2)];                     //临时数组
     5     int k=(int)((N-2)*(N-2)*(0.9-0.4*M));  //难度系数
     6     srand(time(0));
     7     x=(N-2)*(N-2);
     8     for(i=0;i<x;i++)
     9     {
    10         tem[i]=(i/8+1)*N+1+i%8;     //tem数组初始值为11-18,21-28,31-38,……,81-88
    11     }
    12     for(i=0;i<k;i++)
    13     {
    14         int t;
    15         y=rand()%(x-i)+i;       //随机生成一个i至x-1间的数据,并将tem[y]与tem[i]交换
    16         t=tem[y];
    17         tem[y]=tem[i];
    18         tem[i]=t;
    19     }
    20     for(i=0;i<N;i++)
    21         for(j=0;j<N;j++)
    22             a[i][j]=2;
    23     for(i=0;i<k;i++)
    24     {
    25         int m,n;
    26         m=tem[i]/10;
    27         n=tem[i]%10;
    28         a[m][n]=0;
    29     }
    30 }

    我们先用一个临时的一位数组来存储11-18,21-28,……,81-88数据,然后根据空格数将数据打乱,选取前多少转换m,n即可。

  • 相关阅读:
    课程设计之第二次冲刺----第一天
    第一个spring冲刺总结
    课程设计之第一次冲刺----第九天
    课程设计之第一次冲刺----第八天
    课程设计之第一次冲刺----第七天
    课程设计之第一次冲刺----第六天
    课程设计之第一次冲刺---第5天
    课程设计之第一次冲刺---第四天
    课程设计之第一次冲刺---第3天
    课程设计之第一次冲刺---第二天
  • 原文地址:https://www.cnblogs.com/xuhang/p/3381244.html
Copyright © 2020-2023  润新知