当前位置: 首页 > news >正文

棋盘问题(放置棋子)

题目:

题目解析:

在n*n的矩阵内描述棋盘,棋盘的“形状”输入决定,只能在#的位置放棋子,棋子不能同行,不能同列。

思路:

逐行尝试,放完第一行放第二行……每行的#都要尝试,同时用一个数组来标记一列上是否已经存在棋子。相当于每次从第一行的某个#出发,前往下一行的#,直到最后一行或者把棋子放完,有点类似于dfs,用递归最方便:

代码:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int cnt = 0;void placeInRow(int row, int k, int n, vector<string>& board, vector<bool>& cols)
{if (k == 0)//如果棋子已经放完了,方案加1{cnt++;return;}if (row == n)//如果最后一行已经放完了,那么结束return;//尝试在当前行的每个有效位置放置棋子for (int col = 0; col < n; col++){if (board[row][col] == '#' && !cols[col]){cols[col] = true;placeInRow(row + 1, k - 1, n, board, cols);//处理下一行cols[col] = false;//回溯的时候要清理棋子}}//当前行无法放置棋子,直接调到下一行placeInRow(row + 1, k, n, board, cols);
}int main()
{int n, k;while (cin >> n >> k){if (n == -1 && k == -1)break;vector<string> board(n);//棋盘for (int i = 0; i < n; i++)cin >> board[i];//读取棋盘信息cnt = 0;//每一轮重置一次countvector<bool> cols(n, false);//列标记placeInRow(0, k, n, board, cols);cout << cnt << endl;}return 0;
}

相关文章:

  • 【Phytium】飞腾FT2000/4 GPIO功能开发实例
  • Python实例题:Python实现Zip文件的暴力破解
  • 游戏盾在非游戏行业的应用实践与价值分析
  • leetcode:372. 超级次方(python3解法,数学相关算法题)
  • 【SQL】关键字
  • 在Spring Cloud中将Redis共用到Common模块
  • 健康管理系统的核心价值:降低成本,提升效率
  • leetcode701.二叉搜索树中的插入操作:迭代法利用有序性寻找空节点插入点
  • Java HashMap原理:高效键值存储的秘密
  • Spring AI(9)——MCP客户端
  • 4060显卡什么水平 4060显卡参数介绍
  • 【QT】理解QT机制之“元对象系统”
  • JavaSE:面向对象进阶之抽象类
  • [python] lock 解决线程安全问题
  • 信号与系统速成-1.绪论
  • Java面试八股(Java基础,Spring,SpringBoot篇)
  • json中对象转字符串和字符串转对象的方法
  • 【Linux系统移植】Cortex-A8 Linux系统移植(超详细)
  • Next.js 布局(Layout)与模板(Template)深度解析:从原理到实战
  • Vue模板语法
  • u8无可用数据源/seo官网优化详细方法
  • 摄影师签约有哪些网站/360建站和凡科哪个好
  • 湛江全套网站建设费用/免费关键词挖掘工具
  • 现在做网站建设的公司多么/苏州seo快速优化
  • 浙江微信网站建设/企业网站seo服务
  • 电商网站推广怎么做/百度站长工具数据提交