OpenJudge 2754 八皇后

1.链接地址:

http://bailian.openjudge.cn/practice/2754

2.题目:

总时间限制:
1000ms
内存限制:
65536kB
描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b 1b 2...b 8,其中b i为相应摆法中第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

3.思路:

首先把说有可能的情况保存到一个vector再查询

寻找方法利用递归+mark

4.代码:

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <vector>

 4 

 5 using namespace std;

 6 

 7 int arr[8][8];

 8 vector<int> v_res;

 9 

10 void f(int sum,int i)

11 {

12     //cout<< "f(" << sum << "," << i << ")" <<endl;

13     int j,k;

14     for(j = 0; j < 8; ++j)

15     {

16         if(arr[i][j] == 0)

17         {

18             if(i == 7)

19             {

20                 v_res.push_back(sum * 10 + (j + 1));

21             }

22             else

23             {

24                 arr[i][j] = 1;

25                 for(k = i + 1; k < 8; ++k) arr[k][j] += 1;

26                 for(k = 1; ((i + k) < 8) && ((j - k) >= 0); ++k) arr[i + k][j - k] += 1;

27                 for(k = 1; ((i + k) < 8) && ((j + k) < 8); ++k) arr[i + k][j + k] += 1;

28                 f(sum * 10 + (j + 1), i + 1);

29                 arr[i][j] = 0;

30                 for(k = i + 1; k < 8; ++k) arr[k][j] -= 1;

31                 for(k = 1; ((i + k) < 8) && ((j - k) >= 0); ++k) arr[i + k][j - k] -= 1;

32                 for(k = 1; ((i + k) < 8) && ((j + k) < 8); ++k) arr[i + k][j + k] -= 1;

33             }

34         }

35     }

36 }

37 

38 int main()

39 {

40     //freopen("C://input.txt","r",stdin);

41 

42     int n;

43     cin>>n;

44 

45         f(0,0);

46 

47     int b;

48     while(n--)

49     {

50         cin>>b;

51         cout<<v_res[b - 1]<<endl;

52     }

53     return 0;

54 }

 

你可能感兴趣的:(open)