黄药师参考全真教天罡北斗阵,琢磨出了一套阵法,并且布置在桃花岛上,名为:二十八星宿大阵。
在之后郭襄被金轮法王所抓,黄药师将其运用在战场上。四万人结阵,对付蒙古的四个万人队,以及数万人伏兵。
故有了:以四万五林群豪困住八万蒙古兵的江湖传说。
可今天黄老邪遇到了一个小问题,着实让他伤脑筋,于是他希望路过的江湖侠士可以帮助他解决这个难题。
【英雄帖】
【问题描述】
在八行八列的棋盘上放置八枚棋子,使得任意的八枚棋子不能互相吃。
那什么情况棋子会发生互吃呢?
当一棋子位于另一棋子的同一行、同一列、甚至是同一对角线就会发生互吃的情况。【输入数据】
无
【输出数据】
输出方案:
例如:1 5 8 6 3 7 2 4
或: 6 2 7 1 4 8 5 3
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iomanip>
using namespace std;
int sum = 0;
int Queen[9]; // Queen[2]=3 表示第二个皇后在第二行第三列
int Danger[9]; // Danger[1...8] 第i列有皇后了
int Plus[17]; // 行 加 列
int Minus[17]; // 行 减 列
void Print(){
sum++;
cout<<"第"<<sum<<"套方案"<<endl;
for(int i=1; i<=8; i++){
cout<<setw(4)<<Queen[i];
}
cout<<endl;
}
int Search(int i){
for(int j=1; j<=8; j++){
if( (!Danger[j]) && (!Plus[i+j]) && (!Minus[i-j+7])){
Queen[i] = j; // 第i个皇后放在第j列上
Danger[j] = 1; // 第i列被占领了
Plus[i+j] = 1; // 对角线相加为一常数
Minus[i-j+7] = 1; // 对角线相减为一常数
if(i==8)
Print();
else
Search(i+1);
Danger[j] = 0;
Plus[i+j] = 0;
Minus[i-j+7] = 0;
}
}
}
int main()
{
memset(Queen,0,sizeof(Queen));
memset(Danger,0,sizeof(Danger));
memset(Plus,0,sizeof(Plus));
memset(Minus,0,sizeof(Minus));
Search(1);
return 0;
}