ブルーブリッジカップ第3回C/C++予選本題(7)駒を置く(水題)
32257 ワード
今は6 x 6の碁盤格があります.その中のいくつかの格子はすでに駒を置いてある.行ごとに列ごとにちょうど3つの駒があるように、もう少し上に置きます.私たちはすべての可能な放出法を推定したい.次のコードはこの機能を実現します.
初期配列では「1」は駒が置かれていることを示し,「0」は空白を示す.
コードロジックを分析し、スクライブのコードを推測してください.
答えは「解答.txt」ファイルに書かれています
注意:線の先に記入すべき内容だけを書き、線の前後の内容は書き写さないでください.
回答:
テストコード:
Freecode : www.cnblogs.com/yym2013
初期配列では「1」は駒が置かれていることを示し,「0」は空白を示す.
1 int N = 0; 2
3 bool CheckStoneNum(int x[][6]) 4 { 5 for(int k=0; k<6; k++) 6 { 7 int NumRow = 0; 8 int NumCol = 0; 9 for(int i=0; i<6; i++) 10 { 11 if(x[k][i]) NumRow++; 12 if(x[i][k]) NumCol++; 13 } 14 if(_____________________) return false; //
15 } 16 return true; 17 } 18
19 int GetRowStoneNum(int x[][6], int r) 20 { 21 int sum = 0; 22 for(int i=0; i<6; i++) if(x[r][i]) sum++; 23 return sum; 24 } 25
26 int GetColStoneNum(int x[][6], int c) 27 { 28 int sum = 0; 29 for(int i=0; i<6; i++) if(x[i][c]) sum++; 30 return sum; 31 } 32
33 void show(int x[][6]) 34 { 35 for(int i=0; i<6; i++) 36 { 37 for(int j=0; j<6; j++) printf("%2d", x[i][j]); 38 printf("
"); 39 } 40 printf("
"); 41 } 42
43 void f(int x[][6], int r, int c); 44
45 void GoNext(int x[][6], int r, int c) 46 { 47 if(c<6) 48 _______________________; //
49 else
50 f(x, r+1, 0); 51 } 52
53 void f(int x[][6], int r, int c) 54 { 55 if(r==6) 56 { 57 if(CheckStoneNum(x)) 58 { 59 N++; 60 show(x); 61 } 62 return; 63 } 64
65 if(______________) //
66 { 67 GoNext(x,r,c); 68 return; 69 } 70
71 int rr = GetRowStoneNum(x,r); 72 int cc = GetColStoneNum(x,c); 73
74 if(cc>=3) //
75 GoNext(x,r,c); 76 else if(rr>=3) //
77 f(x, r+1, 0); 78 else
79 { 80 x[r][c] = 1; 81 GoNext(x,r,c); 82 x[r][c] = 0; 83
84 if(!(3-rr >= 6-c || 3-cc >= 6-r)) // , !
85 GoNext(x,r,c); 86 } 87 } 88
89 int main(int argc, char* argv[]) 90 { 91 int x[6][6] = { 92 {1,0,0,0,0,0}, 93 {0,0,1,0,1,0}, 94 {0,0,1,1,0,1}, 95 {0,1,0,0,1,0}, 96 {0,0,0,1,0,0}, 97 {1,0,1,0,0,1} 98 }; 99
100 f(x, 0, 0); 101
102 printf("%d
", N); 103
104 return 0; 105 }
コードロジックを分析し、スクライブのコードを推測してください.
答えは「解答.txt」ファイルに書かれています
注意:線の先に記入すべき内容だけを書き、線の前後の内容は書き写さないでください.
回答:
NumRow!=3 || NumCol!=3 f(x,r,c+1) x[r][c]==1
テストコード:
1 #include <stdio.h>
2
3 int N = 0; 4
5 bool CheckStoneNum(int x[][6]) 6 { 7 for(int k=0; k<6; k++) 8 { 9 int NumRow = 0; 10 int NumCol = 0; 11 for(int i=0; i<6; i++) 12 { 13 if(x[k][i]) NumRow++; 14 if(x[i][k]) NumCol++; 15 } 16 if(NumRow!=3 || NumCol!=3) return false; //
17 } 18 return true; 19 } 20
21 int GetRowStoneNum(int x[][6], int r) 22 { 23 int sum = 0; 24 for(int i=0; i<6; i++) if(x[r][i]) sum++; 25 return sum; 26 } 27
28 int GetColStoneNum(int x[][6], int c) 29 { 30 int sum = 0; 31 for(int i=0; i<6; i++) if(x[i][c]) sum++; 32 return sum; 33 } 34
35 void show(int x[][6]) 36 { 37 for(int i=0; i<6; i++) 38 { 39 for(int j=0; j<6; j++) printf("%2d", x[i][j]); 40 printf("
"); 41 } 42 printf("
"); 43 } 44
45 void f(int x[][6], int r, int c); 46
47 void GoNext(int x[][6], int r, int c) 48 { 49 if(c<6) 50 f(x,r,c+1); //
51 else
52 f(x, r+1, 0); 53 } 54
55 void f(int x[][6], int r, int c) 56 { 57 if(r==6) 58 { 59 if(CheckStoneNum(x)) 60 { 61 N++; 62 show(x); 63 } 64 return; 65 } 66
67 if(x[r][c]==1) //
68 { 69 GoNext(x,r,c); 70 return; 71 } 72
73 int rr = GetRowStoneNum(x,r); 74 int cc = GetColStoneNum(x,c); 75
76 if(cc>=3) //
77 GoNext(x,r,c); 78 else if(rr>=3) //
79 f(x, r+1, 0); 80 else
81 { 82 x[r][c] = 1; 83 GoNext(x,r,c); 84 x[r][c] = 0; 85
86 if(!(3-rr >= 6-c || 3-cc >= 6-r)) // , !
87 GoNext(x,r,c); 88 } 89 } 90
91 int main(int argc, char* argv[]) 92 { 93 int x[6][6] = { 94 {1,0,0,0,0,0}, 95 {0,0,1,0,1,0}, 96 {0,0,1,1,0,1}, 97 {0,1,0,0,1,0}, 98 {0,0,0,1,0,0}, 99 {1,0,1,0,0,1} 100 }; 101
102 f(x, 0, 0); 103
104 printf("%d
", N); 105
106 return 0; 107 }
Freecode : www.cnblogs.com/yym2013