【討論】C++之一問


Recommended Posts

到底樂透開獎是如何避免重複呀?

電腦的加分題-矩陣亂數

我用的是很詭異的方法...

1.

cin >>a;

先輸入邊長

假如是3好了

2.

for(i=1;i=a;i++){

for(j=1;j=a;j++){

test[j]=a*(i-1)+j;

}

}

將矩陣填入數字in order

以3來說

1 2 3

4 5 6

7 8 9

3.

for(s=1;s=a;s++){

for(t=1;t=a;t++){

int x=rand();

int y=rand();

int r1=x%a+1;

int r2=y%a+1;

test[t]=test[r1][r2];

}

}

隨機的兩個兩個交換,做a*a次交換

:P有更正統的寫法吧?我的是列出來在隨機對換

樂透可能也是這樣...但好麻煩

鏈接文章
分享到其他網站

#include <cstdlib>

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

{

srand(time(NULL)); //設定亂數擷取來源

int inp, mtx[100]; //陣列定為100(我個人是用一維陣列)

cin >> inp; //輸入邊長

int dup=inp*inp; //邊長平方為dup, 這將作為陣列的元素各數

for(int i=1; i<=dup; i++){

if(i%inp==1){

cout << "\n";} //如果陣列第i個元素除以邊長的餘數為1,則換行

//意思是說假設邊長為3,則在第四個元素輸出前換行

mtx=rand()%dup+1; //mtx陣列第i元素取亂數

BACK:

for(int j=1;j<i;j++){ //這個for是針對1~i 的範圍內檢查陣列第i項有無和前面的重複

if(mtx[j]==mtx){

mtx=rand()%dup+1; //重複的話則再取一次亂數

goto BACK; //再回到之前的BACK,重新從第1項開始檢查

}

}

cout << mtx << " "; //如果都ok則輸出第i項

}

system("PAUSE");

return EXIT_SUCCESS;

}

//goto能不用就不要用(但真的好用)

//以上是個人做法僅供參考

//只允許輸入10以內的範圍(陣列長度)

//這不是個好做法,看來我要多修演算法了 > <

鏈接文章
分享到其他網站