题目链接
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