zoukankan      html  css  js  c++  java
  • POJ-1321 棋盘问题

    第一种思路(by 陈奎学长)

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define MAXN 10
     4 char mp[MAXN][MAXN];
     5 bool col[MAXN];
     6 int ans, n, k;
     7 void dfs(int row, int rest)             //第row行的情况,剩余rest棋子
     8 {
     9     if(rest == 0)                       //已将所有棋子放完
    10     {
    11         ans++;                          //方案数加一
    12         return;
    13     }
    14     if(rest - 1 > n - row) return;      //剩余棋子数>剩余行数,无论如何都不可能形成合法方案
    15     for(int i = 0; i < n; i++)          //枚举第row行的合法位置
    16     {
    17         if(col[i]) continue;            //如果第i列已经有棋子,则不能再放棋子
    18         if(mp[row][i] == '#')           //第i列可放棋子
    19         {
    20             col[i] = true;              //标记第i列以放入棋子
    21             dfs(row + 1, rest - 1);     //搜索下一行
    22             col[i] = false;             //将棋子取出
    23         }
    24     }
    25     dfs(row + 1, rest);                 //row行没有放棋子
    26 }
    27 int main()
    28 {
    29     memset(col, 0, sizeof col);
    30     while(scanf("%d%d", &n, &k) != EOF)
    31     {
    32         if(n == -1 && k == -1) break;
    33         for(int i = 1; i <= n; i++) scanf("%s", mp[i]);
    34         ans = 0;
    35         dfs(1, k);
    36         printf("%d
    ", ans);
    37     }
    38     return 0;
    39 }

    第二种思路(by Album)

     1 #include<iostream>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 #include<cstdio>
     6 #define mem(a, b) memset(a, b, sizeof(a))
     7 using namespace std;
     8 
     9 int n;
    10 char mp[10][10];
    11 
    12 int dfs(int k, int r, bool col[]) {       //遍历到第r行,剩余k个棋子,当前列遍历状况存储在col数组中 
    13     if (!k)                               //棋子已放完 
    14         return 1;                         //返回一种摆法 
    15     if (k > n - r + 1)                    //剩余棋子比剩下行数多,则不可能摆完 
    16         return 0;                         //返回零种摆法 
    17     int ans = 0;                          //ans为当前情况可延伸出的摆法数量 
    18     for (int i=1; i<=n; i++) {            //遍历当前行的每一列 
    19         if (mp[r][i] == '#' && !col[i]) { //假如为棋盘区域且该列没有放过棋子 
    20             bool temp[10];
    21             for (int j=1; j<=n; j++)
    22                 temp[j] = col[j]; 
    23             temp[i] = 1;                  //temp数组为摆上该棋子后的列遍历状况 
    24             ans += dfs(k-1, r+1, temp);   //摆法数量加上摆上该棋子后延伸遍历的情况 
    25         }
    26     }
    27     ans += dfs(k, r+1, col);              //该行不摆棋子的情况 
    28     return ans;                           //返回摆法数量 
    29 }
    30 
    31 int main() {
    32     int k;
    33     while (scanf("%d %d", &n, &k) != EOF && n != -1) {
    34         char c = getchar();
    35         bool col[10];
    36         mem(col, 0);
    37         for (int i = 1; i <= n; i++) {
    38             for (int j = 1; j <= n; j++)
    39                 mp[i][j] = getchar();
    40             char c = getchar();
    41         }
    42         printf("%d
    ", dfs(k, 1, col));   //从第一行开始遍历 
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    怎样在ASP.NET中使用VB.NET上传大文件
    准备开始研读petShop
    Documentum常见问题9—导航树的一些常见设置
    [转]CMMI 入门 基本术语:约束、假设、依赖、风险、承诺
    MyEclipse 8.6反编译插件安装
    Documentum常见问题7—为客户化Type类型Import时添加自定义属性
    【自省篇】程序员的十大技术烦恼
    Documentum常见问题10修改特定Type的显示图标
    打发时间的题目,每天做一点
    Documentum常见问题8—限制导航树上的文件夹个数
  • 原文地址:https://www.cnblogs.com/NWUACM/p/6380878.html
Copyright © 2011-2022 走看看