棋盘问题——POJ1321

Posted Rogn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了棋盘问题——POJ1321相关的知识,希望对你有一定的参考价值。

棋盘问题——深度优先搜索

题目描述:

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

详情请看poj1321:  https://vjudge.net/problem/POJ-1321#author=0

解题思路:

按行进行深搜,总的方案数 = 选取该行中某位置的方案数 + 不选取该行位置的方案数,直至棋子数位0或达到最后一行

代码如下:

 1 #include<stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 int ans = 0;
 5 char map[10][10];
 6 int result[10];
 7 int n, k;
 8 
 9 /********************检查是否冲突*****************/
10 int Check(int row,int col)
11 {
12     int flag = 1;
13     if (row == 0)
14         return flag;
15     for (int i = 0; i < row; i++)
16     {
17         if (result[i] == col)
18             flag = 0;
19     }
20     return flag;
21 }
22 
23 /*************按行搜索,从第row行开始,放k个的方法数*******/
24 void Dfs(int row,int k)
25 {
26     if (row == n || k == 0)  //要开考虑到row == n 且 k == 0的情况
27     {
28         if (k == 0)
29             ans++;
30         return;
31     }
32     for (int col = 0; col < n; col++)
33     {
34         if (map[row][col] == # && Check(row, col))
35         {
36             result[row] = col;
37             Dfs(row + 1, k-1);
38         }
39     }
40     Dfs(row + 1, k);
41     return;
42 }
43 int main()
44 {
45     memset(result, -1, sizeof(result));
46     memset(map, -1, sizeof(map));
47     while (cin>>n>>k && (n != -1 && k != -1))
48     {
49         for (int i = 0; i < n; i++)
50         {
51             for (int j = 0; j < n; j++)
52             {
53                 //scanf("%c", &map[i][j]);        //我也不知道为什么不能用scanf,希望大佬看到了能解释一下
54                 cin >> map[i][j];
55             }
56         }
57         Dfs(0,k);
58         cout << ans<<endl;
59         ans = 0;                //记得归零
60     }
61     return 0;
62 }

我也是刚接触的小白,什么不懂的,希望大家能在下面一起讨论

以上是关于棋盘问题——POJ1321的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1321 棋盘问题

POJ 1321 棋盘问题

POJ1321——棋盘问题

POJ 1321 -- 棋盘问题(DFS)

POJ 1321:棋盘问题

POJ 1321 棋盘问题