JOBDU 1140 八皇后

题目1140:八皇后

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:1064

解决:665

题目描述:

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。
给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

输入:

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)

输出:

输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。

样例输入:
2
1
92
样例输出:
15863724
84136275
来源:
2008年北京大学软件所计算机研究生机试真题

#include <stdio.h>
#include <math.h>
#include <iostream>
#include <string.h>
using namespace std;
int ap[100][8] = {0};
int num;
int tmp[8] = {0};
int ok(int x,int y)
{
    int j;
    for(int i=0;i<x;i++)//小于x!!!只看前面的行数就可以了
    {
        j = tmp[i];
        if(i==x)
            return 0;
        if(j==y)
            return 0;
        if((j-i)==(y-x))
            return 0;
        if((j+i)==(y+x))
            return 0;
    }
    return 1;
}
void dfs(int n)
{
    for(int i=0; i<8; i++)
    {
        if(ok(n,i))
        {
            tmp[n] = i;//注意用一个数组存下每一行的位置,这样存好一点,才能在回溯的时候不改变
            if(n==7)
            {
                for(int i=0; i<8; i++)
                    ap[num][i]=tmp[i]+1;
                num++;
                return;
            }
            dfs(n+1);
            tmp[n] = 0;
        }
    }
}
int main()
{
    num=0;
    dfs(0);
    int n,m;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        for(int i=0; i<8; i++)
            printf("%d",ap[m-1][i]);
        printf("\n");
    }
    return 0;
}

时间: 2024-11-08 00:37:21

JOBDU 1140 八皇后的相关文章

题目1140:八皇后

题目描述: 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. 输入: 第1行是测试数

九度 1140 - 回溯 - 八皇后

会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 一个皇后q(x,y)能被满足以下条件的皇后q(row,col)吃掉 x=row(在纵向不能有两个皇后) y=col(横向) col + row = y+x;(斜向正方向) col - row = y-x;(斜向反方向) 八皇后问题在数据结构书上都有过说明,我们使用回溯的思想.因为每一行只能放一个皇后,所以我们递归每一行,然后循环

[OpenJudge] 百练2754 八皇后

八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. I

python解决八皇后问题

经典回溯算法:八皇后问题 算法要求: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上. 国际象棋的棋盘如下图所示: 问共有多少种不同的方法,并且指出各种不同的放法. # -*- coding:utf-8 -*- __author__ = "tyomcat" print("******八皇后问题的解决方法******") def next_col(current, n=8): length = len(curr

用遗传算法解八皇后问题

此算法收敛速度还可以,基本在1万代之内就能找到解 主程序 clear; clc; %% %八皇后问题,8X8的棋盘上,放置8个皇后,使之两两都不能攻击 %初始的状态,随机在棋盘上放置8个皇后,每列放一个 n = 8; %8皇后 %% %用遗传算法计算 %先随机获得几个个体,形成一个种群 %这个种群有10个个体 No_of_people = 10; people = randi(n,[No_of_people,n]); %计算每个初始种群的h值 people_h = ones(No_of_peop

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

关于八皇后问题

八皇后问题主要是关于实现递归程序方面的知识. 问题描述: 会下象棋的人都知道:皇后可以在横竖,斜线上不限步数的吃掉其他棋子,如何将八个皇后放在棋盘上,使他们谁都不被吃掉,这就是著名的八皇后问题.对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2....b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题有92组解.求出八皇后问题的所有解. 解题思路: 使用8*8矩阵作为模拟棋盘,以每一行为单位进行选择放置皇后,在放置皇后的同时将放置的皇后的控制范围画出,在

八皇后

八皇后(可以扩展为N皇后问题) 每行每列每个对角线都不允许有两个或两个以上的皇后 回溯,递归求解 #include<iostream>/// 八皇后 #include<cstdio> using namespace std; int c[10]; /// 第i行 列为a[i] int total; int n; /// 在一条主对角线上 则它们的 x-y相同 y=x+b /// 在一条负对角线上 则它们的 x+y相同 y=-x+b int v[3][100]; /// v[0]列

八皇后回溯递归 40行不到

个人感觉代码还算精简,比较容易混淆的一点是,board[] 数组,数组下表指的是八皇后棋盘的行,数组下标对应的值指的是八皇后棋盘的列,至于abs()可以去百度,是一个求绝对值的函数 #include <iostream> using namespace std ; #define N 8 static int sum = 0 ; const int max = N ; void print (int board []) { for(int i = 0 ;i < max ;i++) { c