【C 語言入門】隨機生成九宮格

二位陣列隨機生成九宮格

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

int main()
{
    srand(time(0));
    int v[3][3] = {{1,2,3}, {4,5,6},{7,8,9}};
    int i,j,k=0;
    for(i=0; i<3; i++){
        for(j=0;j<3;j++){
            int r= rand()%(9-k)+k;
            int m=r/3;
            int n=r%3;
            int t=v[i][j];
            v[i][j]=v[m][n];
            v[m][n]=t;
            k++;
        }
    }
    for(i=0;i<3;i++){
        for(j=0;j<3;j++){
            printf("%d",v[i][j]);
        }
        printf("\n");
    }
    return 0;
}

我們來仔細看程式細節。

可以知道,第一個有兩個 for loop 的迴圈是把數據寫入陣列 v 中,而第二個迴圈則是把 v 陣列中的元素個別輸出。

我們先來看看第一個迴圈的細節。

我先個別輸出 r 的值,這樣會更容易理解。

for(i=0; i<3; i++){
        for(j=0;j<3;j++){
            int r= rand()%(9-k)+k;
            printf("%d\n",r);
            int m=r/3;
            int n=r%3;
            int t=v[i][j];
            v[i][j]=v[m][n];
            v[m][n]=t;
            k++;
        }
    }

其中 m 是縱座標,n 是橫座標。

輸出是長這樣的:

2
5
8
3
5
8
7
7
8
369
421
875


k=0 ,r=2,i=0,j=0
m=r/3=2/3=0
n=r%3=2%3=2
t=v[i][j];
v[i][j]=v[m][n];
v[m][n]=t;
v[0][2]=1
v[0][0]=3

321
456
789

k=1 ,r=5,i=0,j=1
m=r/3=5/3=1
n=r%3=5%3=2
v[1][2]=2
v[0][1]=6

361
452
789

k=2 ,r=8,i=0,j=2
m=r/3=8/3=2
n=r%3=8%3=2
v[2][2]=1
v[0][2]=9

369
452
781

k=3 ,r=3,i=1,j=0
m=r/3=3/3=1
n=r%3=3%3=0
v[1][0]=4
v[1][0]=4

這裡剛好是同一個位置,就不需要交換,所以九宮格中還是一樣的數字。

369
452
781

k=4 ,r=5,i=1,j=1
m=r/3=5/3=1
n=r%3=5%3=2
v[1][2]=5
v[1][1]=2

369
425
781

k=5 ,r=8,i=1,j=2
m=r/3=8/3=2
n=r%3=8%3=2
v[2][2]=5
v[1][2]=1

369
421
785

k=6 ,r=7,i=2,j=0
m=r/3=7/3=2
n=r%3=7%3=1
v[2][1]=7
v[2][0]=8

369
421
875

k=7 ,r=7,i=2,j=1
m=r/3=7/3=2
n=r%3=7%3=1
v[2][1]=7
v[2][1]=7

這裡剛好是同一個位置,就不需要交換,所以九宮格中還是一樣的數字。

369
421
875

k=8 ,r=8,i=2,j=2
m=r/3=8/3=2
n=r%3=8%3=2
v[2][2]=5
v[2][2]=5

369
421
875

以上就是我們隨機產生的九宮格,和一開始 compiler 輸出的結果一樣。

2
5
8
3
5
8
7
7
8
369
421
875

一維陣列隨機生成九宮格

一維陣列生成九宮格的方法和二維陣列很類似,都是產生一個隨機數字,然後再進行交換。

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

int main()
{
    srand(time(0));
    int v[9] = {1,2,3,4,5,6,7,8,9};
    int i;
    for(i=0; i<9; i++){
        int m= rand()%(9-i)+i;
        int t=v[i];
        v[i]=v[m];
        v[m]=t;
    }
    for(i=0;i<9;i++){
        printf("%d",v[i]);
        if(i%3==2){
            printf("\n");

        }
    }
    return 0;
}

Leave a Comment

Your email address will not be published. Required fields are marked *