棋盘问题

来源:互联网 发布:鹿铃动画片 知乎 编辑:程序博客网 时间:2024/06/10 09:28
棋盘问题
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 19220 Accepted: 9585

Description

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

Input

输入含有多组测试数据。 
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n 
当为-1 -1时表示输入结束。 
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。 

Output

对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。

Sample Input

2 1#..#4 4...#..#..#..#...-1 -1

Sample Output

21

Source

/**写个搜索练一练~~~**/#include <map>#include <set>#include <list>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <vector>#include <bitset>#include <cstdio>#include <string>#include <numeric>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>#include <functional>using namespace std;typedef long long  ll;typedef unsigned long long ull;int dx[4]= {-1,1,0,0};int dy[4]= {0,0,-1,1}; //up down left rightbool inmap(int x,int y,int n,int m){    if(x<1||x>n||y<1||y>m)return false;    return true;}int hashmap(int x,int y,int m){    return (x-1)*m+y;}#define eps 1e-8#define inf 0x7fffffff#define debug puts("BUG")#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define read freopen("in.txt","r",stdin)#define write freopen("out.txt","w",stdout)#define maxn 65struct Node{    int x,y,flag;} Map[maxn];int M[maxn][maxn]={0};int N,K;int num=0;int sum=0;void init(){    num=1;    sum=0;    memset(Map,0,sizeof(Map));    memset(M,-1,sizeof(M));}bool gao(int x,int y,int k){    int s=0;    if(s==k)        return 1;    for(int i=1;i<=N;i++)    {        if(M[i][y]>0)        {            int X=M[i][y];            if(Map[X].flag==1)            {                return 0;            }        }    }    for(int i=1;i<=N;i++)    {        if(M[x][i]>0)        {            int X=M[x][i];            if(Map[X].flag==1)            {                return 0;            }        }    }    return 1;}void DFS(int k,int pre){    if(k==K)        sum++;    else    {        for(int i=pre+1;i<num;i++)            if(gao(Map[i].x,Map[i].y,k))            {                Map[i].flag=1;                DFS(k+1,i);                Map[i].flag=0;            }    }}int main(){    while(~scanf("%d%d",&N,&K)&&N>-1)    {        init();        getchar();        for(int i=1; i<=N; i++)        {            for(int j=1; j<=N; j++)            {                char x;                scanf("%c",&x);                if(x=='#')                {                    M[i][j]=num;                    Map[num].x=i;                    Map[num].y=j;                    num++;                }            }            getchar();        }        DFS(0,0);        printf("%d\n",sum);    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打孩子越打上瘾怎么办 八个月不想要了怎么办 胎儿心脏畸形肺动脉瓣闭锁怎么办 小孩爱动怎么办补什么 初中孩子下午上课总犯困怎么办 孩子上课精神不集中怎么办 孩子玩兴奋了就打人怎么办 婴儿兴奋白天不睡觉怎么办 小孩读书精神不集中怎么办 小孩上课精神不集中怎么办 小孩学习精神不集中怎么办 孩子暑假天天看电视不出门怎么办 七个月宝宝缺铁怎么办 天天运动为什么还便秘怎么办 小孩学习注意力不集中怎么办 8个月宝贝太好动怎么办 学生在校受伤家长该怎么办 多动症小孩爱动手指怎么办 孩子大了不听话该怎么办 流产后吹了风怎么办 怀孕1周内喝酒了怎么办 怀孕6周喝酒了怎么办 怀孕后喝了酒怎么办 不知道怀孕喝酒了怎么办 不知道怀孕了喝酒了怎么办 怀孕5天喝酒了怎么办 打孩子耳光后脸肿了怎么办 老师说上课不专心怎么办 孩子不专心好动马虎怎么办 学生上课不认真听讲怎么办 一年级孩子上课不注意听讲怎么办 一年级孩子上课说话不听课怎么办 一年级孩子上课不听课怎么办 小学一年级学生上课不专心怎么办? 小孩听课注意力不集中怎么办 小孩子上课精神不集中怎么办 孩子说我不画了怎么办 幼儿园小朋友上课不专心怎么办 孩子写作业不专心怎么办 小孩做作业不专心怎么办 孩子上课精力不集中怎么办