棋盘问题 POJ-1321 DFS

题目大意

在n*n的不规则的棋盘上摆放k枚棋子,要求每行和每列上只能有一枚棋子。

思路

和八皇后问题类似,只不过这个问题不一定是一行摆放一个。因此dfs的时候要多用一个参数来表示当前搜索的行数。

题解

 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4
 5 int n,k,ans;
 6 char a[10][10];
 7 bool vis[10];
 8
 9 void dfs(int num, int row)
10 {
11     if(num >= k)
12     {
13         ans++;        //放完所有的棋子,答案数+1
14         return;
15     }
16     for(int i = row; i < n; i++)
17     {
18         for(int j = 0; j < n; j++)
19         {
20             if(!vis[j] && a[i][j] == ‘#‘)
21             {
22                 vis[j] = true;        //在[i][j]位置放一枚棋子
23                 dfs(num+1, i+1);    //搜索下一行能放的位置
24                 vis[j] = false;        //回溯到上一行的状态
25             }
26         }
27     }
28 }
29
30 int main(){
31 #ifdef debug
32     freopen("test.txt","r",stdin);
33 #endif
34     while(cin >> n >> k)
35     {
36         if(n == -1 && k == -1) return 0;
37         ans = 0;
38         memset(vis, false, sizeof(vis));
39         memset(a, 0, sizeof(a));
40         for(int i = 0; i < n; i++)
41         {
42             for(int j = 0; j < n; j++)
43             {
44                 cin >> a[i][j];
45             }
46         }
47         dfs(0,0);
48         cout << ans << endl;
49     }
50     return 0;
51 }

原文地址:https://www.cnblogs.com/SaltyFishQF/p/10293736.html

时间: 2024-12-24 09:30:51

棋盘问题 POJ-1321 DFS的相关文章

状态压缩动态规划 -- 棋盘问题 POJ 1321

一个 N * N 的棋盘上面,有些格子不能放,放置 M 的棋子, 每两个棋子不能在同一行或者同一列,问有多少种放法 DFS太慢,用SCR好点点 Python 只有 22 行,其实可以更短,但是得排成很长很长的一行 while True: table = [ [ 0 for j in range( 300 ) ] for i in range( 12 ) ] table[0][0] = 1 boardsize, chessnum = map( int, raw_input().split() )

(深搜)棋盘问题 -- poj -- 1321

链接: http://poj.org/problem?id=1321 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28899   Accepted: 14307 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据.

棋盘问题 POJ - 1321

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k <= n 当为-1 -1时表示输入结束. 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白

poj 1321 DFS

棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28790   Accepted: 14255 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示

A - 棋盘问题 POJ - 1321

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目. n <= 8 , k <= n 当为-1 -1时表示输入结束. 随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白

POJ 1321 棋盘问题 --- DFS

POJ 1321 棋盘问题 http://poj.org/problem?id=1321 /*POJ 1321 棋盘问题 --- DFS*/ #include <cstdio> #include <cstring> int n, k, cnt; bool visit[10]; //标记列的访问状态 char mapp[10][10]; /*从第r行开始正确放置p个棋子*/ void dfs(int r, int p){ if (p == 0){ ++cnt; return; } i

POJ 1321 棋盘问题(dfs回溯)

A - 棋盘问题 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1321 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每

poj 1321 棋盘问题 【DFS】

题意:... 策略:深搜. 仔细分析我们发现,我们只需要对列进行标记,对于行我们考虑放棋子还是不放就行了. 代码: #include<stdio.h> #include<string.h> char s[10][10]; int n, m; int vis[10]; int ans; void dfs(int cur, int step) { if(step == m){ ans ++; return; } if(cur > n-1) return ; int i, j; f

DFS POJ 1321 棋盘问题

题目传送门 1 /* 2 DFS:因为一行或一列都只放一个,可以枚举从哪一行开始放,DFS放棋子,同一列只能有一个 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 using namespace std; 8 9 char maze[10][10]; 10 bool vis[10]; 11 int n, k, ans; 12 13 void DFS(int x, int num

POJ 1321 棋盘问题 (DFS)

题目链接:棋盘问题 解析:dfs暴力从上到下.从左到右搜索. AC代码: //代码1 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int n, k, ans; char maze[10][10]; bool vis[10][10]; void dfs(int x, int y, int step){ if(step == k){ ans ++; return