acwing kuangbin专题打卡第一题棋盘问题

acwing 1114.棋盘问题
传送门

  • 题目大意:给你一个n * n的矩阵,其中里面包含两种字符’#‘和’.’,’#‘表示是棋盘,即可以放棋子,‘.’表示是空白区域不可以放棋子,现在给你k个棋子,要求每一行,每一列上不能有两颗棋子,问棋子有多少种摆放的可能
  • 思路:直接使用dfs进行爆搜即可
  • 代码如下
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 10;
char g[N][N];
bool line[N];//因为每次直接处理下一行,所以只需要标记列即可
int n, k, m;
int res;
void dfs(int x)//按行进行摆放然后爆搜
{
    if (m == k) 
    {
        res ++;
        return ;
    }
    else if (x == n) return ;
    for (int i = 0; i < n; i ++)
        if (!line[i] && g[x][i] == '#')
        {
            line[i] = true;//进行摆放
            m ++;
            dfs(x + 1);
            m --;
            line[i] = false;//恢复现场
        }
    dfs(x + 1);//此行也可以不放棋子
}
int main()
{
    while (scanf("%d%d", &n, &k) || ( n != -1 && k != -1))
    {
        for (int i = 0; i < n; i ++) cin >> g[i];
        res = 0;
        m = 0;
        memset(line, false, sizeof(line));
        dfs(0);
        printf("%d\n", res);
    }
    return 0;
}
上一篇:简单记录爬虫例子


下一篇:Java编写简单计算器