您的位置:首页 > 产品设计 > UI/UE

UVa 750 - 8 Queens Chess Problem

2013-09-04 16:59 435 查看
  题目大意:八皇后问题,在一个8*8的棋盘上,放置8个皇后,使得任意两个皇后不在同一行上、不在同一列上、不在同一条对角线上,不过这道题预先给定了一个位置放置一个皇后,让你输出所有可能的答案。

  经典的回溯问题,具体可参考《算法竞赛入门经典》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种方案,然后从中选择就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: