poj1321 棋盘问题(DFS)

题目链接

http://poj.org/problem?id=1321

题意

给定一块棋盘(棋盘可能是不规则的),有k个相同棋子,将k个棋子摆放在棋盘上,使得任意两个棋子不同行,不同列,求有多少种不同的摆法。

思路

此题和八皇后问题很像,需要注意摆放完毕后要恢复现场,便于下一次摆放。

代码

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5
 6 const int N = 10;
 7 char board[N][N];
 8 int visit[N];   //visit[j]=1表示第j列有棋子, 0表示无棋子
 9 int n, k;
10 int cnt;       //摆放方案数
11
12 void dfs(int k, int r)
13 {
14     if(k==0)
15     {
16         cnt++;
17         return;
18     }
19
20     for(int i=r; i<N; i++)
21     {
22         for(int j=0; j<N; j++)
23         {
24             if(board[i][j]==‘#‘&& !visit[j])
25             {
26                 visit[j] = 1;
27                 dfs(k-1, i+1);  //从下一行开始搜索
28                 visit[j] = 0;   //恢复现场,便于回溯
29             }
30         }
31     }
32 }
33
34 int main()
35 {
36     //freopen("poj1321.txt", "r", stdin);
37     while(cin>>n>>k)
38     {
39         if(n==-1)
40             return 0;
41         for(int i=0; i<n; i++)
42             cin>>board[i];
43
44         memset(visit, 0, sizeof(visit));
45         cnt = 0;
46         dfs(k, 0);
47         cout<<cnt<<endl;
48     }
49     return 0;
50 }
时间: 2024-11-29 05:43:21

poj1321 棋盘问题(DFS)的相关文章

poj-1321棋盘摆放 DFS

http://poj.org/problem?id=1321 #include<stdio.h> #include<iostream> #include<math.h> #include<stdlib.h> #include<ctype.h> #include<algorithm> #include<vector> #include<string.h> #include<queue> #includ

POJ1321 棋盘问题 dfs

太简单了 没啥好说的 存个档 #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; const int N=1e9; int n,k,ans; string a[9];//map bool vis[9];//column void dfs(int x,int step){//current line if(step==k){ans+

POJ1321 棋盘问题

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

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

poj1321 棋盘问题(深搜dfs)

转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1321">http://poj.org/problem?id=1321 -----------------------------------------------------------------------------------------------------------------------------------------------

DFS——poj1321棋盘问题

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

poj1321棋盘问题(dfs+摆放问题)

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

【dfs】POJ1321 棋盘问题

题目链接: http://poj.org/problem?id=1321 题解: http://www.tuicool.com/articles/nE7BNj 1 #include<cstdio> 2 #include<cstring> 3 char mat[15][15]; 4 bool col[15]; 5 int n, k, ans; 6 7 void dfs(int line, int cnt){ 8 if(cnt == k){ 9 ans++; 10 return; 11

棋盘问题 dfs分层搜索(n皇后变式)

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