八皇后代碼--九度oj-1140

題目描述:

會下國際象棋的人都很清楚:皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。如何將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

代碼:
/*
x橫座標,表示列
y縱座標,表示行

*/


/*
剪枝:
因爲逐行放置,橫向的可以不用判斷。
所以點的上面,左斜上方,右斜上方也可以不判斷

*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;

#define LL __int64

int vis[8][8];//用於標記
int vx[]={0,1,-1};
int vy[]={1,1,1};
int ba[98];//存儲每種情況
int temp[8];
int theba=0;//ba[]數組的下標
//標記
int biaoji(int x,int y)
{
	vis[y][x]++;
	int i,a,b;
	for(i=0;i<3;i++)
	{
		for(a=x+vx[i],b=y+vy[i];a>=0 && a<8 && b>=0 && b<8;a+=vx[i],b+=vy[i])
		{
			vis[b][a]++;
		}
	}
	return 0;
}
//回溯
int huisu(int x,int y)
{
	if(vis[y][x]==0)
		return 0;
	int i,a,b;
	for(i=0;i<3;i++)
	{
		for(a=x+vx[i],b=y+vy[i];a>=0 && a<8 && b>=0 && b<8;a+=vx[i],b+=vy[i])
		{
			if(vis[b][a]>0)
				vis[b][a]--;
		}
	}
	vis[y][x]--;
	return 0;
}
//主要算法
int bahuanghou(int x,int y,int num)
{
	int i,j,ten;
	num++;
	temp[y]=x+1;
	if(num>=8)
	{
		for(i=0,ten=10000000;i<8;i++)
		{
			ba[theba]+=temp[i]*ten;
			ten/=10;
		}
		theba++;
		return 0;
	}
	else
	{
		biaoji(x,y);
		j=y+1;
		for(i=0;i<8;i++)
		{
			if(vis[j][i]==0)
			{
				bahuanghou(i,j,num);
				huisu(i,j);
			}
		}
	}
	return 0;
}
int main()
{
	int n,m,i,j;
	memset(ba,0,sizeof(ba));
	for(i=0;i<8;i++)
	{	
		memset(vis,0,sizeof(vis));
		bahuanghou(i,0,0);
	}
	while(~scanf("%d",&n))
	{
		while(n--)
		{
			scanf("%d",&m);
			printf("%d\n",ba[m-1]);
		}
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章