若是凉夜已成梦

青春里 总有些事情要努力去做 总有些梦想要拼命去追。


  • 运维

  • 前端

  • 编程

  • 随笔

  • hust-oj

3147: 搜索基础之棋盘问题

发表于 2017-10-06   |   分类于 HUSTOJ   |   阅读次数 1,556

题目描述

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

输入

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

输出

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

样例输入

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

样例输出

2
1

参考代码

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
char a[10][10];
int n,k,c,sum;
int b[10];
void qipan(int x) 
{
    int i,j;
    if(c==k) 
    {
        sum++;
        return;
    }
    c++;
    for (i=x;i<n-k+c;i++)
    for (j=0;j<n;j++)
    if(a[i][j]=='#'&&b[j]==0) 
    {
        b[j]=1;
        qipan(i+1);
        b[j]=0;
    }
    c--;
}
int main() 
{
    while(scanf("%d%d",&n,&k)!=EOF) 
    {
        int i;
        if(n==-1&&k==-1)
        break;
        c=0;
        sum=0;
        for (i=0;i<n;i++)
        scanf("%s",&a[i]);
        memset(b,0,sizeof(b));
        qipan(0);
        printf("%dn",sum);
}
}

解析

暂无

hustoj

发表评论 取消回复

邮箱地址不会被公开。 必填项已用*标注

*
*


hoxis wechat
著作权归作者所有
站点更新说明
  • 文章目录
  • 站点概览
若是凉夜已成梦

若是凉夜已成梦

青春里 总有些事情要努力去做 总有些梦想要拼命去追。

1904 日志
6 分类
12 标签
RSS
weibo github twitter facebook

友情链接

Dreams孤独患者 原站点 Skip
© 2017 若是凉夜已成梦
Powered by WordPress | 已运行
Theme By NexT.Mist