棋盘问题——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的主要内容,如果未能解决你的问题,请参考以下文章