浩浩同學-資訊學-2020-07-29-學習記錄

robintan發表於2020-07-29

今天練習和複習了下面四道程式: 1)隨機生成100個隨機數。 ```

include

include

include

define random(x) rand()%(x)

using namespace std;

int main(){ srand((int)time(0)); for (int i=0;i<100;i++){ cout<
}

```

2)輸入100個整數(上題的輸出正好是這題的輸入),用shell排序法輸出正確的順序。 ```

include

include

using namespace std; void ShellSort(int a[],int n){ for(int gap=n/2;gap>0;gap/=2){ for(int i=gap;i<n;++i){ int j=i; while(j-gap>=0 && a[j-gap]>a[j]) { a[j-gap] = a[j-gap]+a[j]; a[j] = a[j-gap]-a[j]; a[j-gap] = a[j-gap]-a[j]; j=j-gap; } } } for(int i=0;i<n;++i)cout<<a[i]<<" "; } int main(){ int a[100]; for(int i=0;i<100;i++) cin>>a[i]; ShellSort(a,100); return 0; } ```

3)使用至少兩種方法完成“八皇后問題”。今晚介紹了兩種,方法一:簡單直接8個for迴圈;方法二:遞迴求解。詳見下面程式碼。 程式1: ```

include

using namespace std; int total=0; bool check(int a[]){ for(int i=0;i<8;i++){ for(int j=i+1;j<8;j++){ if(a[i]==a[j]) return false; if(a[i]-a[j]==i-j||a[i]-a[j]==j-i) return false; } } return true; } void print(int a[]){ cout<<++total<<":"; for(int i=0;i<8;i++) cout<
for(int b2=0;b2<8;b2++){ a[2]=b2; for(int b3=0;b3<8;b3++){ a[3]=b3; for(int b4=0;b4<8;b4++){ a[4]=b4; for(int b5=0;b5<8;b5++){ a[5]=b5;
for(int b6=0;b6<8;b6++){ a[6]=b6; for(int b7=0;b7<8;b7++){ a[7]=b7; if(check(a)) print(a); } } } }
} } } } return 0; } ```

程式2: ```

include //八皇后問題遞迴方法

using namespace std; int total = 0; int a[8] = { -1,-1,-1,-1,-1,-1,-1,-1 }; bool check(int row, int col) { // 在row行,col列可以放置皇后嗎? for (int i = 0; i < row; i++) // 判斷同列、對角線是否有皇后衝突 if (a[i] == col || row - i == col - a[i] || row - i == a[i] - col) return false; // 返回0表示不能放,有衝突 return true; } void find(int n) { if (n == 8) { // 遞迴函式的出口,從0到7行都已經放置完畢, total++; // 並且都是正確的,所以當n=8的時候,方案數加1 cout<
} } int main() { find(0); return 0; } ```