我想了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;
}
}
}
沒有留言:
張貼留言