hrbust 1283 又见皇后

来源:互联网 发布:plc编程梯形图实例 编辑:程序博客网 时间:2024/05/16 14:44

又见皇后Time Limit: 3000 MSMemory Limit: 65536 KTotal Submit: 122(33 users)Total Accepted: 45(25 users)Rating: Special Judge: NoDescription国际象棋中,皇后能攻击同一横线、同一竖线、同一斜线(45度)的敌人。

众所周知,有一个非常著名的算法问题,是求在一个n×n的国际象棋棋盘中最多能摆放多少个皇后,使其不能相互攻击。

今天我们暂且不要让问题如此理想化。假设棋盘上有一些障碍物,皇后不能摆在障碍物上,同时也不能穿过障碍物攻击别人。在此条件之下,棋盘上最多又能放多少个皇后?

                            

图中黑色方块表示障碍物,圆点表示皇后

2是一种最优摆法;图4、图5属于违规摆法

Input输入包含多组数据。

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

n=0表示输入结束。

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

Sample Input4

.X..

...X

XXX.

..X.

2

XX

.X

3

.X.

X.X

.X.

0

Sample Output4

1

2




数据给的小/。。

时间也多。。

直接暴力跑。。

因为有阻隔点所以一行可能存在不止一个点。



#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 10int res;int n;int m;char maps[N][N];int vis[N][N];int judge(int x,int y){    for(int i=y-1; i>=0&&maps[x][i]=='.'; i--)        if(vis[x][i]==1)            return 0;    for(int i=x-1; i>=0&&maps[i][y]=='.'; i--)    {        if(vis[i][y]==1)            return 0;    }    for(int i=x-1,j=y-1; i>=0&&maps[i][j]=='.'&&j>=0; j--,i--)    {        if(vis[i][j]==1)            return 0;    }    for(int i=x-1,j=y+1; i>=0&&maps[i][j]=='.'&&j<n; j++,i--)    {        if(vis[i][j]==1)            return 0;    }    return 1;}void dfs(int pos,int tmp){    if(pos>=m)        return ;    if(res<tmp)    {        res=tmp;    }    pos++;    dfs(pos,tmp);    if(maps[pos/n][pos%n]=='.'&&judge(pos/n,pos%n))    {        vis[pos/n][pos%n]=1;        dfs(pos,tmp+1);        vis[pos/n][pos%n]=0;    }    return ;}int main(){    while(scanf("%d",&n),n)    {        res=0;        memset(vis,0,sizeof(vis));        for(int i=0; i<n; i++)        {            scanf("%s",maps[i]);        }        m = n*n;        if(maps[0][0]=='.')        {            vis[0][0]=1;            dfs(0,1);            vis[0][0]=0;        }dfs(0,0);        printf("%d\n",res);    }}


原创粉丝点击