문제: 서양장기판에 어떤 두 여왕말도 같은 행, 열, 대각선에 있지 않도록 n개 여왕말을 놓아라.입력: 양의 정수 n출력: n X n 서양장기판에 n개 여왕말을 서로 위협받지 않고 놓을 수 있는 가능한 모든 방법. 각 출력은 인덱스 범위가 1부터 n까지인 정수 배열 col로 이루어진다. 여기서 col[i]는 i번째 행에 있는 여왕말의 놓여 있는 열이다.void queens(index I){index j;if(promissing(i))if(i == n) cout << col[1] through col[n];elsefor (j=1; j<=n; j++){ //(i+1)번째 행에 있는 여왕말을 n개의 열에 col[i + 1] = j;//놓을 수 있는지 각각 검사queens(i + 1);}}bool promissing (index I){index k;bool switch;k = 1;switch = true;//i번째 행에 있는 여왕말을 위협하는while (k<i && switch){//여왕말이 있는지 검사if(col[i] == col[k] || abs(col[i] - col[k]) == i - k)switch = false;k++}return switch;}#define n 4//입력값: n행 x n열 서양 장기판에 n개의 여왕말int col[n+1];//i번째 행에 있는 여왕말이 놓여있는 열int count=1;bool promising(int i);void queens(int i){int j; if(promising(i)){if(i==n){ cout<<endl<<"("<<count<<") ";count++;for(j=1; j<=n; j++)cout<<col[j]<<" ";}elsefor(j=1; j<=n; j++){//(i+1)번째 행에 있는 여왕말을 n개의 열에 col[i+1]=j;//놓을 수 있는지 각각 검사queens(i+1);}}
[스템프 찍기]4장 연습문제ㆍ2 프림 알고리즘을 이용하여 다음 그래프의 최소비용 신장 트리를 구하라. 그리고 수행되는 절차를 단계별로 보여라.[ 가중치 그래프 ] 1.정점 v1을 먼저 선택2.{v1}에서 가장 가까이 있는 정점 v4 선택 3. {v1,v4}에서 가장 가까이 있는 정점 v8 선택4. {v1,v4,v8}에서 가장 가까이 있는 정점 v9 선택 5. {v1,v4,v8,v9}에서 가장 가까운 v5 선택6. {v1,v4,v8,v9,v5}에서 가장 가까운 v10 선택 7. {v1,v4,v8,v9,v5,v10}에서 가장 가까운 v6 선택8. {v1,v4,v8,v9,v5,v10,v6}에서 가장 가까운 v3 선택 9. {v1,v4,v8,v9,v5,v10,v6,v3}에서 가까운 v7 선택10. v2 선택 [ 최소비용 신장 트리 ]ㆍ3 하나 이상의 최소비용 신장 트리를 가진 그래프를 하나 그려라ㆍ6 크루스칼 알고리즘을 사용하여 2번 문제의 그래프의 최소비용 신장 트리를 구하라. 그리고 수행되는 절차를 단계별로 보여라[ 가중치 그래프 ] 1. 이음선을 가중치가 작은 것부터 차례로 정렬(v4,v5) 3(v8,v9) 4(v3,v7) 5(v6,v10) 6(v4,v5) 10(v9,v10) 12(v1,v4) 17(v3,v4) 18(v5,v9) 25(v5,v6) 28(v1,v2) 32(v2,v5) 45(v7,v8) 592. 서로소 부분집합 구축 3. 이음선 (v4, v5) 선택4. 이음선 (v8, v9) 선택 5. 이음선 (v3, v7) 선택6. 이음선 (v6, v10) 선택 7, 이음선 (v4, v8) 선택8, 이음선 (v9, v10) 선택 9. 이음선 (v1, v4) 선택10, 이음선 (v3, v4) 선택 11. 이음선 (v1, v2) 선택ㆍ8 최소비용 신장 트리에 사이클이 존재할 수 있다고 생각하는가? 그리고 왜 그런 답이 나오는지를 밝혀라최소비용 신장 트리에서 사이클이 존재할 수 없다. 왜냐하면 최소비용 신장 트리 이전에 신장 트리 자체가 사이클이 포함돼 있지 않은 그래프이기 때문.ㆍ11 다익스트라 알고리즘을 사용하여 문제 2의 그래프에서 정점 v4에서 다른 모든 정점으로 가는 최단경로를 구하라. 그리고 수행되는 절차를 단계별로 보여라. 여기서 각 비방향 이음선은 같은 가중치를 가진 2개의 쌍방향 이음선을 나타낸다고 가정하자.< 가중치 그래프 > v4에서부터의 최단경로 계산1. 가장 가까운 v8 선택. 2. 정점 v8만 지나는 가장 가까운 v9 선택v4 → v8 최단 경로 {v4, v8} v4 → v9 최단 경로 {v4, v8, v9}3. 가장 가까운 v5 선택 4. {v4, v8, v9}에 속한 정점만 지나는 v10 선택v4 → v5 최단 경로 {v4, v5}v4 → v10 최단 경로 {v4, v8, v9, v10}5. {v4, v8, v9, v10}에 속한 정점만 지나는 v6 선택 6. 가장 가까운 v1 선택v4 → v6 최단 경로 {v4, v8, v9, v10, v6} v4 → v1 최단 경로 {v4, v1}7. 가장 가까운 v3 선택 8. 정점 v3만 지나는 v7 선택v4 → v3 최단 경로 {v4, v3} v4 → v7 최단 경로 {v4, v3, v7}9. 정점 v1만 지나는 v2 선택v4 → v2 최단 경로 {v4, v1, v2}ㆍ12 다익스트라 알고리즘을 구현하는 프로그램을 작성하고, 여러 가지 다른 그래프를 가지고 성능을 측정하라.ㆍ알고리즘문제: 가중치포함 방향그래프에서 v1에서 다른 모든 정점으로 가는 최단경로를 구하라.입력: 정수 n>=2와 정점의 개수가 n인 연결된, 가중치포함 비방향그래프. 이 그래프는 2차원 배열 W로 표현되며, 행과 열의 인덱스는 각각 1부터 n까지이다. 여기서 W[i][j]는 I번째 정점에서 j번째 정점을 잇는 이음선상의 가중치가 된디.출력: 최단경로상에 놓여 있는 이음선의 집합 Fvoid dijkstra(int n, const number W[][], set of edges& F){index I, vnear;edge e;index touch[2..n];number length[2...n];F = empty_set;for ( i = 2; i
[스템프 찍기]Ⅲ. Report (15. 04. 17)1. 최소곱셈 …………………………………………………………………………………202. 노드의 탐색, 삽입, 삭제 메서드를 포함한 리스트 클래스 …………213. 프림의 알고리즘 (최소 비용 신장 트리) ……………………………………224. Ⅲ 연습문제 ……………………………………………………………………………241. 최소 곱셈 Minimum Multiplyㆍ알고리즘문제: n 개의 행렬을 곱하는 데 필요한 기본곱셈의 횟수를 최소값과 그 최소값을 주는 순서를 구하라입력: n(행렬의 개수), 인덱스의 범위가 0부터 n까지인 정수 배열 d, 여기서 d[i-1] X d[i]는 I번째 행렬의 크기가 된다출력: minmult(n 개 행렬을 곱하는 데 필요한 기본 곱셈의 횟수의 최소값). P(최적의 순서를 구할 수 있는 2차원 배열)여기서 P의 행의 인덱스는 1부터 n - 1 까지이고, 열의 인덱스는 1부터 n 까지이다. P[i][j]의 값은 i 부터 j 까지행렬을 곱할 때 최적의 순서로 갈라지는 기점을 나타낸다.void minmult(int n, const int d[][], index P[][]){index i, j, k. diagonal;int M[1..n][1..n];for(i=1; i
문제: n 개 키를 비내림차순으로 정렬입력: 양의 정수 n, 키의 배열 S(첨자는 1부터 n까지)출력: 키가 비내림차순으로 정렬된 배열 Svoid mergesort(int n, keytype S[]){ if (n>1) { const int h = ⌊n/2⌋, m = n - h; keytype U[1..h], V[1..m]; copy S[1] through S[h] to U[1] through U[h]; copy S[h+1] through S[n] to V[1] through V[m]; mergesort(h, U); mergesort(m, V); merge(h, m, U, V, S); }}문제: 2개의 정렬된 배열을 하나의 정렬된 배열로 합병입력: 양의 정수 h와 m, 정렬된 키의 배열 U(1부터 h까지), 정렬된 키의 배열 V(1부터 m까지)출력: U와 Ω의 키들을 모두 포함하여 정렬된 배열 S(1부터 h+m까지)void merge(int h, int m, const keytype U[], const keytype V[], keytype S[]){ index i = 1, j = 1, k = 1; while ( i<=h && j<=m ) { if( U[i] < V[j] ){ S[k] = U[i]; i++; }else{ S[k] = V[j]; j++; } if( i>h ) copy V[j] through V[m] to S[] through S[h+m]; else copy U[i] through U[h] to S[] through S[h+m];ㆍ코드void MergeSort( int n, int *s);void Merge( int h, int m, const int *u, const int *v, int *s );void main(){ int s[] = {27,10,12,20,25,13,15,22}, i; MergeSort(8, s);