1. 程式人生 > >POJ 1321(DP初步_I題)解題報告

POJ 1321(DP初步_I題)解題報告

org sin return 題意 存在 分享圖片 problem aps 題目

題目鏈接:http://poj.org/problem?id=1321

--------------------------------------------------------

題意:給定棋盤區域,要求對於k個棋子存在多少種不同的擺放方案

思路:經典dfs,標記行列進行深搜,然後取消標記。循環得到擺放方案的種數

代碼:

技術分享圖片
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include
<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN =10
+10; int n,k; char chess[MAXN][MAXN]; int row[MAXN]; int col[MAXN]; int sum; void dfs(int step,int hang) { if(step==k) { sum++; return ; } for(int i=hang;i<n;i++) { for(int j=0;j<n;j++) { if(row[i]==1
||col[j]==1||chess[i][j]!=#) continue; else { row[i]=col[j]=1; dfs(step+1,i); row[i]=col[j]=0; } } } } int main() { while(scanf("%d%d",&n,&k)&&(n!=-1&&k!=-1)){ memset(chess,0,sizeof(chess)); memset(row,0,sizeof(row)); memset(col,0,sizeof(col)); sum=0; for(int i=0;i<n;i++){ scanf("%s",&chess[i]); } dfs(0,0); printf("%d\n",sum); } return 0; }
View Code

POJ 1321(DP初步_I題)解題報告