File tree Expand file tree Collapse file tree 1 file changed +60
-0
lines changed Expand file tree Collapse file tree 1 file changed +60
-0
lines changed Original file line number Diff line number Diff line change @@ -143,5 +143,65 @@ var totalNQueens = function(n) {
143
143
return count;
144
144
};
145
145
```
146
+
147
+ C
148
+ ``` c
149
+ // path[i]为在i行,path[i]列上存在皇后
150
+ int *path;
151
+ int pathTop;
152
+ int answer;
153
+ // 检查当前level行index列放置皇后是否合法
154
+ int isValid (int index, int level) {
155
+ int i;
156
+ //updater为若斜角存在皇后,其所应在的列
157
+ //用来检查左上45度是否存在皇后
158
+ int lCornerUpdater = index - level;
159
+ //用来检查右上135度是否存在皇后
160
+ int rCornerUpdater = index + level;
161
+ for(i = 0; i < pathTop; ++i) {
162
+ //path[ i] == index检查index列是否存在皇后
163
+ //检查斜角皇后:只要path[ i] == updater,就说明当前位置不可放置皇后。
164
+ //path[ i] == lCornerUpdater检查左上角45度是否有皇后
165
+ //path[ i] == rCornerUpdater检查右上角135度是否有皇后
166
+ if(path[ i] == index || path[ i] == lCornerUpdater || path[ i] == rCornerUpdater)
167
+ return 0;
168
+ //更新updater指向下一行对应的位置
169
+ ++lCornerUpdater;
170
+ --rCornerUpdater;
171
+ }
172
+ return 1;
173
+ }
174
+
175
+ //回溯算法:level为当前皇后行数
176
+ void backTracking(int n, int level) {
177
+ //若path中元素个数已经为n,则证明有一种解法。answer+1
178
+ if(pathTop == n) {
179
+ ++answer;
180
+ return;
181
+ }
182
+
183
+ int i;
184
+ for(i = 0; i < n; ++i) {
185
+ //若当前level行,i列是合法的放置位置。就将i放入path中
186
+ if(isValid(i, level)) {
187
+ path[pathTop++] = i;
188
+ backTracking(n, level + 1);
189
+ //回溯
190
+ --pathTop;
191
+ }
192
+ }
193
+ }
194
+
195
+ int totalNQueens(int n){
196
+ answer = 0;
197
+ pathTop = 0;
198
+ path = (int * )malloc(sizeof(int) * n);
199
+
200
+ backTracking(n, 0);
201
+
202
+ return answer;
203
+ }
204
+ ```
205
+
146
206
-----------------------
147
207
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
You can’t perform that action at this time.
0 commit comments