皇后问题的变异【DFS】

Description

             在国际象棋中,皇后能攻击同一横线、同一竖线、同一斜线(45 度)的敌人。众所周 知,有一个非常著名的算法问题,是求在一个 n×n 的国际象棋棋盘中最多能摆放多少个皇 后,使其不能相互攻击。今天我们暂且不要让问题如此理想化。假设棋盘上有一些障碍物, 皇后不能摆在障碍物上,同时也不能穿过障碍物攻击别人。在此条件之下,棋盘上最多又能 放多少个皇后?

                                                   

Input

输入包含多组数据每组数据的第一行是一个整数 n(1≤n≤8),表示棋盘的边长。之后的 n 行将描述棋盘,其中’X’ 表示该单元格有障碍物,’.’则表示没有。n=0 表示输入结束。

Output

对于每组数据,请输出一个整数表示最多能在棋盘上放几个皇后,使它们相互不能攻击。 每个答案占一行。

Sample Input

4

.X.. 

...X

XXX.

..X.

Sample Output

4

解法:

        由于数据比较小,n最大不超过10,所以直接暴力DFS;

code

#include<stdio.h>
#include<string.h>
#define inf 0x3f3f3f3f
char map[10][10];
int n;
int ans;
int check(int r,int c)
{
    int i;
	int rr,cc;
	for(i=r;i>=0;i--)/*判断每一列*/
	{
	    if(map[i][c]=='O')return 0;
		if(map[i][c]=='X')break;
	}
	for(i=c;i>=0;i--)/*判断每一行*/
	{
	     if(map[r][i]=='O')return 0;
		 if(map[r][i]=='X')break;
	}
	rr=r;
	cc=c;
	while(cc>=0&&rr>=0)/*判断左上对角线,注意终止条件*/
	{
	   
	   if(map[rr][cc]=='O')return 0;
	   if(map[rr][cc]=='X')break;
	   rr-=1;
	   cc-=1;
	}
	rr=r;
	cc=c;
	while(rr>=0&&cc<n)/*判断右上对角线,注意终止条件*/
	{
	   if(map[rr][cc]=='O')return 0;
	   if(map[rr][cc]=='X')break;
	   rr-=1;
	   cc+=1;
	}
	return 1;
}
void dfs(int i,int num)
{
     int r,c;
	 if(i==n*n)
	 {
	    if(num>ans)
			ans=num;
		return;
	 }
	 else 
	 {
	    r=i/n;
		c=i%n;
		if(map[r][c]!='X'&&check(r,c))
		{
		    map[r][c]='O';
			dfs(i+1,num+1);
			map[r][c]='.';
		}
		dfs(i+1,num);
	 }
}
int main()
{
	int i;
	while(scanf("%d",&n)!=-1&&n)
	{
	     getchar();
		 memset(map,'\0',sizeof(map));
		 for(i=0;i<n;i++)
		 {
		    scanf("%s",map[i]);
			getchar();
		 }
		 ans=-inf;
         dfs(0,0);
		 printf("%d\n",ans);
	}
    return 0;
}



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

图中黑色方块表示障碍物,圆点表示皇后 图 2 是一种最优摆法;图 4、图 5 属于违规摆法

 

Input

 

输入包含多组数据。

 

每组数据的第一行是一个整数 n(1≤n≤8),表示棋盘的边长。之后的 n 行将描述棋盘,其中’X’ 表示该单元格有障碍物,’.’则表示没有。

 

n=0 表示输入结束。

 

Output

 

对于每组数据,请输出一个整数表示最多能在棋盘上放几个皇后,使它们相互不能攻击。 每个答案占一行。

 

Sample Input

 

4

 

.X..

 

...X

 

XXX.

 

..X. 2


 

1


 

XX

 

.X

 

3

 

.X.

 

X.X

 

.X.

 

0

 

Sample Output

 

4

 

1

 

2

你可能感兴趣的:(皇后问题的变异【DFS】)