zoukankan      html  css  js  c++  java
  • 1217:棋盘问题

    题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1217

    1217:棋盘问题


    时间限制: 1000 ms         内存限制: 65536 KB
    提交数: 3207     通过数: 1502 

    【题目描述】

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

    【输入】

    输入含有多组测试数据。

    每组数据的第一行是两个正整数n,k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 (n8,kn)

    当为1 1时表示输入结束。

    随后的n行描述了棋盘的形状:每行有n个字符,其中 #表示棋盘区域,.表示空白区域(数据保证不出现多余的空白行或者空白列)。

    【输出】

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

    【输入样例】

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

    【输出样例

    2
    1

    解析:
    这是一道八皇后的变式题,具体来讲就是不默认棋子数,不默认棋盘大小和形状,因此我们必须考虑到可放置棋子的数量与行数的关系,若照搬八皇后的解法,是无法搜索到整张棋盘的。
    故,将其具体分析,得知我们需要让每次放置方法的起始行递增,直到搜索完整张棋盘。其他还是和八皇后没太大区别。
    参考代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<string>
     7 #include<cstdlib>
     8 #include<queue>
     9 #include<vector>
    10 #define INF 0x3f3f3f3f
    11 #define PI acos(-1.0)
    12 #define N 101
    13 #define MOD 2520
    14 #define E 1e-12
    15 using namespace std;
    16 int l[10],n,k,ans=0,a[10][10];// l判断列上是否有棋子,a储存棋盘 
    17 char c;
    18 void dfs(int x,int step)//x当前行,step当前放置棋子数 
    19 {
    20     if(step==k) ans++;
    21     else
    22     for(int i=x;i<n;i++)//从x行开始搜索下面的剩余棋盘,以得到整张棋盘的解 
    23      for(int j=0;j<n;j++)
    24      {
    25          if(l[j]==0&&a[i][j]==1)
    26          {
    27              l[j]=1;
    28              dfs(i+1,step+1);
    29             l[j]=0;
    30         }
    31      }
    32 }
    33 int main()
    34 {
    35     do
    36     {
    37         memset(l,0,sizeof(l));
    38         memset(a,0,sizeof(a));
    39         ans=0;
    40         scanf("%d%d",&n,&k);
    41         if(n==-1&&k==-1) break;
    42         for(int i=0;i<n;i++)
    43         {
    44             for(int j=0;j<n;j++)
    45              {
    46                  cin>>c;
    47                  if(c=='#') a[i][j]=1;
    48                  else a[i][j]=0;
    49             }
    50         }
    51         dfs(0,0);
    52         printf("%d
    ",ans);
    53     }while(n!=-1&&k!=-1);
    54     return 0;
    55 }
    
    

    2019-03-24 00:23:55

     
  • 相关阅读:
    微信第三方登录,ios第三方登录(没有进行二次封装,直接调用)
    How Do I Declare A Block in Objective-C?
    Android与JS混编(js调用java)
    React-Native做一个文本输入框组件
    如何在程序退出的时候清除activity栈
    React react-ui-tree的使用
    React-Native OpenGL体验二
    React-Native OpenGL体验一
    react-native使用react-art制作SVG动画
    Android画一个随意拖动的圆形
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/10586610.html
Copyright © 2011-2022 走看看