HDU 2553 N皇后问题(经典的回溯问题)
2017-11-06 21:28
232 查看
我的这个把注释去掉就可以输出满足时的棋盘。
提前打表,不然会超时
#include<stdio.h>
#include<string.h>
int count;
int n;
int isExist(int i, int j, int (*Q)[11]) {
int s, t;
for (s = i, t = 0; t < n; t++) {
if (Q[s][t] && t != j) return 0;
}
for (s = 0, t = j; s < n; s++) {
if (Q[s][t] && s != i) return 0;
}
for (s = i-1, t = j-1; s >= 0 && t >= 0; s--, t--) {
if (Q[s][t]) return 0;
}
for (s = i-1, t = j+1; s >= 0 && t < n; s--, t++) {
if (Q[s][t]) return 0;
}
for (s = i+1, t = j-1; s < n && t >= 0; s++, t--) {
if (Q[s][t]) return 0;
}
return 1;
}
void Que (int j, int (*Q)[11]) {
int s, t;
if (j == n) {
// for (s = 0; s < n; s++) {
// for (t = 0; t < n; t++) {
// printf("%d ", Q[s][t]);
// }
// putchar('\n');
// }
// printf("\n");
count++;
return ;
}
for (s = 0; s < n; s++) {
if (isExist(s, j, Q)) {
Q[s][j] = 1;
Que(j+1, Q);
Q[s][j] = 0;
}
}
}
int main(void)
{
int Q[11][11], i, num[15];
for (i = 1; i < 11; i++) {
count = 0;
memset(Q, 0, sizeof(Q));
n = i;
Que(0, Q);
num[i] = count;
}
while (scanf("%d", &n) != EOF && n) {
printf("%d\n", num
);
}
return 0;
}
提前打表,不然会超时
#include<stdio.h>
#include<string.h>
int count;
int n;
int isExist(int i, int j, int (*Q)[11]) {
int s, t;
for (s = i, t = 0; t < n; t++) {
if (Q[s][t] && t != j) return 0;
}
for (s = 0, t = j; s < n; s++) {
if (Q[s][t] && s != i) return 0;
}
for (s = i-1, t = j-1; s >= 0 && t >= 0; s--, t--) {
if (Q[s][t]) return 0;
}
for (s = i-1, t = j+1; s >= 0 && t < n; s--, t++) {
if (Q[s][t]) return 0;
}
for (s = i+1, t = j-1; s < n && t >= 0; s++, t--) {
if (Q[s][t]) return 0;
}
return 1;
}
void Que (int j, int (*Q)[11]) {
int s, t;
if (j == n) {
// for (s = 0; s < n; s++) {
// for (t = 0; t < n; t++) {
// printf("%d ", Q[s][t]);
// }
// putchar('\n');
// }
// printf("\n");
count++;
return ;
}
for (s = 0; s < n; s++) {
if (isExist(s, j, Q)) {
Q[s][j] = 1;
Que(j+1, Q);
Q[s][j] = 0;
}
}
}
int main(void)
{
int Q[11][11], i, num[15];
for (i = 1; i < 11; i++) {
count = 0;
memset(Q, 0, sizeof(Q));
n = i;
Que(0, Q);
num[i] = count;
}
while (scanf("%d", &n) != EOF && n) {
printf("%d\n", num
);
}
return 0;
}
相关文章推荐
- HDU 2553 N皇后问题 --- 经典回溯
- hdu 2553 N皇后问题 dfs回溯
- HDU 2553 N皇后问题 (DFS+回溯)
- 【dfs+回溯】hdu 2553 N皇后问题
- HDOJ 2553 N皇后问题(经典回溯)
- HDU 2553 N皇后问题(回溯 + 剪枝)
- hdu 2553 N皇后问题(DFS+回溯)
- HDU 2553 N皇后问题(深搜+回溯)
- N皇后问题 HDU 杭电2553【递归回溯】
- HDU 2553 N皇后问题 (DFS_回溯)
- hdu 2553 N皇后问题(回溯)
- HDU 2553 N皇后问题(深搜+回溯)
- HDU-2553 N皇后问题(DFS经典题)
- HDU - 2553 N皇后问题 (初试回溯)
- HDU 2553 N皇后问题 (DFS_回溯)
- hdu 2553 N皇后问题 (经典DFS)
- HDU 2553 n皇后问题(回溯)
- hdu 2553 N皇后问题(回溯)
- hdu 2553 N皇后问题 (经典DFS)
- HDU 2553 N皇后问题 dfs回溯+打表