2008年3月29日 星期六

亂數填入陣列

怎麼填數字到5*5方陣內,而每一個方格的數字都不一樣

我想了3個方法:(設陣列由[1]或[1][1]開始)

1.
隨機填入法,如果填過了就再抽一個
這個方法簡單而無腦
缺點是當在5*5的陣列中最後五個數字填入時所完成的機率為

5!/25^5次

而且有可能算不出來@@"所以並不實際


int init_map()
{
    int i,j,r,m,a=1,flag;

    while(1)
    {
        m=rand()%(map_size*map_size)+1;
        flag=0;

        for(i=1;i<=map_size;i++)
        {
            for(j=1;j<=map_size;j++)
            {
                if(map[i][j]==m) //如果找到了的話flag=1
                    flag=1;
            }
        }

        if(flag==1) //找到了的話不填入
            continue;

        map[(a-1)%map_size+1][(a-1)/map_size+1]=m;

        if(a==map_size*map_size) break;

        a++;
    }
}


2.
索引填入法,在填入之後改變未填入的數字陣列範圍
直接看Code


int init_map()
{
    int i,j,m,arr[map_size*map_size];

    for(i=1;i<=map_size*map_size;i++) //依序填入數字
    {
        arr[i]=i;
    }

for(i=1;i<=map_size*map_size;i++)
    {
        m=rand()%(map_size*map_size+1-i)+1;

        map[(i-1)%map_size+1][(i-1)/map_size+1]=arr[m]; //填入陣列

        for(j=m;j<=map_size*map_size-i;j++) //往前遞補
        {
            arr[j]=arr[j+1];
        }
    }
}



3.
快速填入法
先在方陣中依序填入1~25
再依序跟其他的元素交換


int init_map()
{
    int i,j,m,n,tmp;

    for(i=1;i<=map_size;i++)
    {
        for(j=1;j<=map_size;j++)
        {
            map[i][j]=(i-1)*map_size+j; //依序填入
        }
    }

    for(i=1;i<=map_size;i++)
    {
        for(j=1;j<=map_size;j++)
        {
             m=rand()%map_size+1; //亂數抽出一個座標
             n=rand()%map_size+1;

             tmp=map[i][j]; //交換
             map[i][j]=map[m][n];
             map[m][n]=tmp;
        }
    }
}

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...