当前位置: 首页 > 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;
}

http://www.xdnf.cn/news/713773.html

相关文章:

  • ranges属性验证
  • 逻辑回归详解:从原理到实践
  • notion搭建个人知识管理库
  • 利用Python制作环保志愿者招募海报
  • 设计师如何搭建自己的素材库?
  • useRef、useForwardRef 和 useImperativeHandle
  • SpringSecurity
  • 深入了解 C# 异步编程库 AsyncEx
  • Minimax-speech-hd
  • Qt DateTimeEdit(时间⽇期的微调框)
  • 【QQ音乐】sign签名| data参数加密 | AES-GCM加密 | webpack实战 (下)
  • ElasticSearch简介及常用操作指南
  • TypeScript中?和!号用法
  • Asp.Net Core 托管服务
  • Cannot find any provider supporting AES/ECB/PKCS7Padding
  • 智能外呼系统中 NLP 意图理解的工作原理与技术实现
  • 【前端】Vue3 中实现两个组件的动态切换保活
  • 制造企业生产数据分析全解析:5大类数据定义、分析方法与落地指南
  • 【Oracle】DCL语言
  • 【深度学习新浪潮】什么是混合精度分解?
  • Docker常用命令操作指南(一)
  • OPC Client第6讲(wxwidgets):Logger.h日志记录文件(单例模式);登录后的主界面
  • 【HTML/CSS面经】
  • 各国竞争的下一代液晶技术:中国铁电液晶取得重大突破突破
  • python和风api获取天气(JSON Web Token)
  • PostgreSQL如何更新和删除表数据
  • 【达梦数据库】内存使用资源评估
  • 图片压缩工具 | 发布到咸鱼并配置网盘自动发货
  • 通义灵码2.5——基于MCP实现我的12306火车票智能查询小助手
  • 66常用控件_QTableWidget的使用