UVa 750 - 8 Queens Chess Problem
2013-09-04 16:59
435 查看
题目大意:八皇后问题,在一个8*8的棋盘上,放置8个皇后,使得任意两个皇后不在同一行上、不在同一列上、不在同一条对角线上,不过这道题预先给定了一个位置放置一个皇后,让你输出所有可能的答案。
经典的回溯问题,具体可参考《算法竞赛入门经典》7.4.1,不过这道题对输出的要求说的挺模糊的,要特别注意输出的格式。开始不知道,就WA了一次...
View Code
为了提高时间,可以预先打表,貌似只有92种方案,然后从中选择就可以了。
经典的回溯问题,具体可参考《算法竞赛入门经典》7.4.1,不过这道题对输出的要求说的挺模糊的,要特别注意输出的格式。开始不知道,就WA了一次...
#include <cstdio> #include <cstring> #define N 8 bool vis[3][2*N]; int r, c, kase; int ans ; void search(int cur) { if (cur == N) { printf("%2d ", ++kase); for (int i = 0; i < N; i++) printf("%d%s", ans[i]+1, (i==N-1) ? "\n" : " "); return; } if (cur == c) search(cur+1); else { for (int i = 0; i < N; i++) if (!vis[0][i] && !vis[1][cur-i+N] && !vis[2][cur+i]) { ans[cur] = i; vis[0][i] = vis[1][cur-i+N] = vis[2][cur+i] = 1; search(cur+1); vis[0][i] = vis[1][cur-i+N] = vis[2][cur+i] = 0; } } } int main() { #ifdef LOCAL freopen("in", "r", stdin); #endif int T; scanf("%d", &T); while (T--) { scanf("%d%d", &r, &c); r--; c--; memset(vis, 0, sizeof(vis)); vis[0][r] = 1; vis[1][c-r+N] = 1; vis[2][c+r] = 1; ans[c] = r; kase = 0; printf("SOLN COLUMN\n"); printf(" # 1 2 3 4 5 6 7 8\n\n"); search(0); if (T) printf("\n"); } return 0; }
View Code
为了提高时间,可以预先打表,貌似只有92种方案,然后从中选择就可以了。
相关文章推荐
- UVA 750 - 8 Queens Chess Problem
- UVa 750 - 8 Queens Chess Problem
- UVA750 UVALive5358 8 Queens Chess Problem题解
- 8 Queens Chess Problem
- UVa Problem 10161 Ant on a Chessboard (棋盘上的蚂蚁)
- 2018_1_25_8 Queens Chess Problem_打表
- UVA 10161 --- Problem A.Ant on a Chessboard 找规律
- [UVALive 7670] Asa's Chess Problem
- 8 Queens Chess Problem
- UVa 10161 Problem A.Ant on a Chessboard
- UVa729 The Hamming Distance Problem
- UVa 10161 Ant on a Chessboard
- Codeforces 100548G - The Problem to Slow Down You & UVAlive 7041 :回文自动机
- UVa Problem 10258 Contest Scoreboard (比赛计分板)
- UVa Problem 10041 Vito’s Family (Vito 家族)
- The Blocks Problem UVA - 101
- UVa Problem 10198 Counting (数数)
- UVa Problem 10042 Smith Numbers (Smith 数)
- UVa 11214 - Guarding the Chessboard(迭代加深搜索)
- UVa 10161 Ant on a Chessboard