17.11.3 五子棋判断输赢

Posted TobicYAL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17.11.3 五子棋判断输赢相关的知识,希望对你有一定的参考价值。

描述
在一个N×N的棋盘上下五子棋,给定一个五子棋黑白棋的落子序列 (x0,y0),(x1,y1), ..., (xn,yn),判断走到多少步时,哪方获胜。

关于输入
第一行有两个整数,棋盘的大小N和落子序列的长度n。  其余各行每行两个数字,分别表示黑棋或白棋棋子在棋盘上的位置。  定输入一定合理的,而且一定能分出输赢,但因为对弈双方没有判断出输赢而多行了数步。

关于输出
输出为一行,包含两个整数,第一个整数是判断出输赢时行棋的步数,第二个数字表示获胜方。如果黑方获胜,输出0;如果白方获胜,输出1。

例子输入
10 12
 0 0
 1 0
 0 1
 2 0
 0 2
 3 0
 0 3
 4 0
 0 4
 5 0
 0 5
 6 0
 
 
例子输出
9 0
提示
五子棋规则比较复杂,这里我们只要求黑棋先行,谁先连出至少5连子就算赢,不管是否出现规则中约束的禁手。每局棋都有胜负结果。

 

技术分享
  1 #include<iostream>
  2 using namespace std;
  3 int main()
  4 {
  5     int N, n,flat=0;
  6     cin >> N >> n;
  7     int chess[50][50];
  8     int col1, line1,col2,line2;
  9     for (int i = 0; i < 50; i++)
 10         for (int j = 0; j < 50; j++)
 11             chess[i][j] = 0;
 12     for (int i = 1; i <= n; i++)
 13     {
 14         if (i % 2 != 0)
 15         {
 16             cin >> line1 >> col1;
 17             chess[line1][col1] = -1;
 18             for (int j = 0; j <= 4; j++)
 19             {
 20                 if (line1 + j > N || col1 + j > N)
 21                     continue;
 22                 if (line1 - 4 + j < 0 || col1 - 4 + j < 0)
 23                     continue;
 24                 flat = 0;
 25                 for (int p = 0; p <= j; p++)
 26                 {
 27                     if (chess[line1 + p][col1 + p] == -1)
 28                         flat++;
 29                 }
 30                 for (int p = 0; p <= 4 - j; p++)
 31                 {
 32                     if (chess[line1 - p][col1 - p] == -1)
 33                         flat++;
 34                 }
 35                 if (flat == 6)
 36                 {
 37                     cout << i << " " << "0";
 38                     return 0;
 39                 }
 40             }
 41             flat = 0;
 42             for (int j = 0; j <= 4; j++)
 43             {
 44                 if (line1 + j > N || col1 - j < 0)
 45                     continue;
 46                 if (line1 - 4 + j < 0 || col1 + 4 - j >N)
 47                     continue;
 48                 flat = 0;
 49                 for (int p = 0; p <= j; p++)
 50                 {
 51                     if (chess[line1 + p][col1 - p] == -1)
 52                         flat++;
 53                 }
 54                 for (int p = 0; p <= 4 - j; p++)
 55                 {
 56                     if (chess[line1 - p][col1 + p] == -1)
 57                         flat++;
 58                 }
 59                 if (flat == 6)
 60                 {
 61                     cout << i << " " << "0";
 62                     return 0;
 63                 }
 64             }
 65             flat = 0;
 66             for (int j = 0; j <= 4; j++)
 67             {
 68                 if (line1 + j > N)
 69                     continue;
 70                 if (line1 - 4 + j < 0)
 71                     continue;
 72                 flat = 0;
 73                 for (int p = 0; p <= j; p++)
 74                 {
 75                     if (chess[line1 + p][col1] == -1)
 76                         flat++;
 77                 }
 78                 for (int p = 0; p <= 4 - j; p++)
 79                 {
 80                     if (chess[line1 - p][col1] == -1)
 81                         flat++;
 82                 }
 83                 if (flat == 6)
 84                 {
 85                     cout << i << " " << "0";
 86                     return 0;
 87                 }
 88             }
 89             flat = 0;
 90             for (int j = 0; j <= 4; j++)
 91             {
 92                 if (col1 + j > N)
 93                     continue;
 94                 if (col1 - 4 + j < 0)
 95                     continue;
 96                 flat = 0;
 97                 for (int p = 0; p <= j; p++)
 98                 {
 99                     if (chess[line1][col1 + p] == -1)
100                         flat++;
101                 }
102                 for (int p = 0; p <= 4 - j; p++)
103                 {
104                     if (chess[line1][col1 - p] == -1)
105                         flat++;
106                 }
107                 if (flat == 6)
108                 {
109                     cout << i << " " << "0";
110                     return 0;
111                 }
112             }
113         }
114         else
115         {
116                 cin >> line2 >> col2;
117                 chess[line2][col2] =1;
118                 flat = 0;
119                 for (int j = 0; j <= 4; j++)
120                 {
121                     if (line2 + j > N || col2 + j > N)
122                         continue;
123                     if (line2 - 4 + j < 0 || col2 - 4 + j < 0)
124                         continue;
125                     flat = 0;
126                     for (int p = 0; p <= j; p++)
127                     {
128                         if (chess[line2 + p][col2 + p] == 1)
129                             flat++;
130                     }
131                     for (int p = 0; p <= 4 - j; p++)
132                     {
133                         if (chess[line2 - p][col2 - p] == 1)
134                             flat++;
135                     }
136                     if (flat ==6)
137                     {
138                         cout << i << " " << "0";
139                         return 0;
140                     }
141                 }
142                 flat = 0;
143                 for (int j = 0; j <= 4; j++)
144                 {
145                     if (line2 + j > N || col2 - j < 0)
146                         continue;
147                     if (line2 - 4 + j < 0 || col2 + 4 - j >N)
148                         continue;
149                     flat = 0;
150                     for (int p = 0; p <= j; p++)
151                     {
152                         if (chess[line2 + p][col2 - p] == 1)
153                             flat++;
154                     }
155                     for (int p = 0; p <= 4 - j; p++)
156                     {
157                         if (chess[line2 - p][col2 + p] == 1)
158                             flat++;
159                     }
160                     if (flat == 6)
161                     {
162                         cout << i << " " << "0";
163                         return 0;
164                     }
165                 }
166                 flat = 0;
167                 for (int j = 0; j <= 4; j++)
168                 {
169                     if (line2 + j > N)
170                         continue;
171                     if (line2 - 4 + j < 0)
172                         continue;
173                     flat = 0;
174                     for (int p = 0; p <= j; p++)
175                     {
176                         if (chess[line2 + p][col2] == 1)
177                             flat++;
178                     }
179                     for (int p = 0; p <= 4 - j; p++)
180                     {
181                         if (chess[line2 - p][col2] == 1)
182                             flat++;
183                     }
184                     if (flat == 6)
185                     {
186                         cout << i << " " << "0";
187                         return 0;
188                     }
189                 }
190                 flat = 0;
191                 for (int j = 0; j <= 4; j++)
192                 {
193                     if (col2 + j > N)
194                         continue;
195                     if (col2 - 4 + j < 0)
196                         continue;
197                     flat = 0;
198                     for (int p = 0; p <= j; p++)
199                     {
200                         if (chess[line2][col2 + p] == 1)
201                             flat++;
202                     }
203                     for (int p = 0; p <= 4 - j; p++)
204                     {
205                         if (chess[line2][col2 - p] == 1)
206                             flat++;
207                     }
208                     if (flat ==6)
209                     {
210                         cout << i << " " << "0";
211                         return 0;
212                     }
213                 }
214         }
215     }
216     return 0;
217 }
View Code

在我看来这道题非常考验耐心和细心……以及如果是考试的话一定要冷静……

不知道有没有更便捷些的解法

(神烦

以上是关于17.11.3 五子棋判断输赢的主要内容,如果未能解决你的问题,请参考以下文章

五子棋的判断输赢规则 -- java编程(简单优化完整版)

五子棋输赢判定算法

手把手教你C语言五子棋的实现(双玩家对战)

C语言实现简单的三子棋

C语言实现简单的三子棋

c语言——五子棋游戏