poj 1321(简单的dfs,棋盘问题)

本文介绍了一种使用深度优先搜索(DFS)解决特定棋盘问题的方法。问题要求在一个n*n的棋盘上放置棋子,棋盘上的'#'位置可以放置棋子,且每行每列只能放置一个棋子。通过DFS遍历所有可能的放置方式,找到所有符合条件的摆放方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意就是有一个n*n的棋盘,只有#能放棋子,而且每一横行纵行只能同时存在一个棋子。问摆起方案。

棋盘问题应该算是简单的dfs中的典型吧, 吐一句槽,刚写这一题的时候以为是只有"."才能放棋,debug了半天。。才发现题目看错了。
关于做法,首先把棋盘用一个字符数组存起来,然后由于每一横行纵行只能存在唯一棋子,所以我们只需要讨论纵行的情况。

用一个布尔数组来判断该步是否走过,即可,由于数据很小所以也不用考虑剪枝。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
using namespace std;
const int N = 2e5 + 7;
const int M = 1e3 + 7;
const int Q = 1000000007;
const int INF = 0x3f3f3f;
typedef long long ll;
typedef double dl;
int n,k,t,ans = 0;
bool a[9]; // 存储该横行是否走过
char chess[9][9]; // 存储棋盘
void dfs(int cnt,int row) // cnt表示已放棋子数,row表示当前横行
{
    if(cnt == k){ // 如果放棋子数达到预期棋子数,更新ans
        ans++;
        return ;
    }
    if(row >= n) return ; // 防止栈溢出
    for(int i = 0;i < n;++i){ // i表示列数
        if(chess[row][i] == '#' && !a[i]){
            a[i] = true; // 走该位置
            dfs(cnt + 1,row + 1); // 走该位置递归
            a[i] = false; // 不走该位置
        }
    }
    dfs(cnt,row + 1); // 不走当前横行
}
int main()
{
    while(cin >> n >> k && n != -1){
        for(int i = 0;i < n;++i)
            cin >> chess[i];
        memset(a,false,sizeof a);
        dfs(0,0);
        cout << ans << endl;
        ans = 0; // 记得刷新全局变量ans
    }
    return 0;
}

感觉跟n皇后问题差不多的。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值