Emmm,我又来 POJ 了,这题感觉比上次做的简单点。类似皇后问题。但是稍微做了一点变形,比如棋子数量是不定的。棋盘形状不在是方形等等。

题目链接:POJ 1321 棋盘问题


解题思路

基本思路:从上往下放旗子,每种情况完成后,复盘继续下一种情况。

这里讲一下,void backTrack(int left, int x) 函数。

left 表示还剩的棋子数量,显然如果 left 为 0,说明所有棋子已放完,那么方案数 solution 加 1。

如果不为 0。那么继续检查当前位置的列是否有棋子,如果无棋子,那么当前位置可以放旗子。然后继续递归,棋子数量减 1,行数加 1。如果有棋子,那么悔棋 1 步。继续下一个位置。

C代码

/**
* @author wowpH
* @date 2019-9-14 19:54:16
*/
#include<stdio.h>
#include<string.h> #define TRUE 1
#define FALSE 0 #define MAX_N 8 // 矩阵最大为8 #define BOARD TRUE // 棋盘
#define BLANK FALSE // 空白 int matrix[MAX_N][MAX_N];// 矩阵,BOARD表示棋盘,BLANK表示空白 int n, k, solution;// solution最终结果 int column[MAX_N];// 每列是否有棋子,TRUE表示有棋子,FALSE表示无棋子 void backTrack(int left, int x) {// 回溯,left表示剩余棋子,x表示当前行
if (left == 0) {// 无多余棋子
++solution; // 方案数加1
return;
} // 遍历x行及下方的棋盘
for (int i = x; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (matrix[i][j] == BLANK) {// 空白
continue; // 不能放旗子
}
if (column[j] == TRUE) {// 第j列有棋子
continue; // 不能放旗子
} column[j] = TRUE; // 当前位置可以放子,设为TRUE
backTrack(left - 1, i + 1); // 回溯,棋子数减1,行数加1
column[j] = FALSE; // 复盘,设为无子
}
}
} int main() {
while (scanf("%d %d", &n, &k) && n != -1 && k != -1) {
getchar();// '\n' // 输入棋盘
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
char ch = getchar();
if (ch == '.') {
matrix[i][j] = BLANK;// 空白
} else if (ch == '#') {
matrix[i][j] = BOARD;// 棋盘
}
}
getchar();// '\n'
} // 初始化
memset(column, FALSE, sizeof(column));
solution = 0; backTrack(k, 0);// 回溯 printf("%d\n", solution);
}
return 0;
}

提交结果

POJ 1321 棋盘问题(C)回溯的更多相关文章

  1. Poj 1321 棋盘问题 【回溯、类N皇后】

    id=1321" target="_blank">棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Subm ...

  2. (简单) POJ 1321 棋盘问题,回溯。

    Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子 ...

  3. POJ 1321 棋盘问题 (DFS + 回溯)

    题目链接:http://poj.org/problem?id=1321 题意:中文题目,就不多说了...... 思路: 解题方法挺多,刚开始想的是先从N行中选择出来含有“#”的K行,再在这K行中放置K ...

  4. poj 1321 棋盘问题 (回溯法)

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 69951   Accepted: 33143 Descriptio ...

  5. POJ 1321 棋盘问题 --- DFS

    POJ 1321 题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子. (注意 .不可放 #可放) 解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标 ...

  6. DFS POJ 1321 棋盘问题

    题目传送门 /* DFS:因为一行或一列都只放一个,可以枚举从哪一行开始放,DFS放棋子,同一列只能有一个 */ #include <cstdio> #include <algori ...

  7. POJ 1321 棋盘问题【DFS/回溯/放与不放/类似n皇后】

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62164 Accepted: 29754 Description 在一 ...

  8. POJ——1321棋盘问题(DFS+回溯)

    棋盘问题 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33272 Accepted: 16456 Description 在一 ...

  9. OpenJudge/Poj 1321 棋盘问题

    1.链接地址: http://bailian.openjudge.cn/practice/1321 http://poj.org/problem?id=1321 2.题目: 棋盘问题 Time Lim ...

随机推荐

  1. dotnetcore docker 简单运行

    今天试用了下mac 版本的dotnetcore sdk,发现还是很方便的,同时官方的容器运行方式,相对小了好多 同时使用多阶段构建的方式运行dotnetcore 安装sdk 下载地址: https:/ ...

  2. SQLSERVER获取数据库中的所有表的名称、表中所有字段的属性

    1.查询数据库中的所有数据库名: SELECT Name FROM Master..SysDatabases ORDER BY Name 2.查询某个数据库中所有的表名: SELECT Name FR ...

  3. lintcode-720重排带整数字符串

    题目描述: 给一包含大写字母和整数(从 0 到 9)的字符串, 试写一函数返回有序的字母以及数字和. 样例 给出 str = AC2BEW3, 返回 ABCEW5字母按字母表的顺序排列, 接着是整数的 ...

  4. Seq2Seq模型 与 Attention 策略

    Seq2Seq模型 传统的机器翻译的方法往往是基于单词与短语的统计,以及复杂的语法结构来完成的.基于序列的方式,可以看成两步,分别是 Encoder 与 Decoder,Encoder 阶段就是将输入 ...

  5. js回文数的四种判断方法

    目录 1. 字符串的转换 1.1 简单点,使用高阶函数来完成 1.2 从后往前循环字符串数组 1.3 以中间数为节点,判断左右两边首尾是否相等 2. 数字转换 2.1 求模得尾数,除10得整数 判断一 ...

  6. Oracle 导出表结构

    Oracle导出表结构 select A.Table_Name 表名 , -- A.column_name 字段名 A.column_name 字段名, A.data_type 数据类型, A.dat ...

  7. Better intuition for information theory

    Better intuition for information theory 2019-12-01 21:21:33 Source: https://www.blackhc.net/blog/201 ...

  8. XML External Entity Injection(XXE)

    写在前面 安全测试fortify扫描接口项目代码,暴露出标题XXE的问题, 记录一下.官网链接: https://www.owasp.org/index.php/XML_External_Entity ...

  9. easyui datagrid的editor编辑器如何为validatebox控件添加改变事件

    项目中需要为行编辑器Editor的某个列的文本框添加改变事件 需求:新增行时,为用户名输入特殊字符进行验证,不允许保存用户数据 html页面 <table id="gridlist&q ...

  10. react 核心技术点

    1.react生命周期 react生命周期分为初始化阶段.运行阶段.销毁阶段. (1) 初始化阶段: componentWillMount:实例挂载之前 Render:渲染组件 componentDi ...