ブルーブリッジカップ第3回C/C++予選本題(7)駒を置く(水題)

32257 ワード

今は6 x 6の碁盤格があります.その中のいくつかの格子はすでに駒を置いてある.行ごとに列ごとにちょうど3つの駒があるように、もう少し上に置きます.私たちはすべての可能な放出法を推定したい.次のコードはこの機能を実現します.
初期配列では「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