今日学习记录
1. POJ - 1321
关键词:回溯
问题分析:
棋盘上有 k 个位置可以放棋子,且每行每列不能放多个棋子,有多少种放法
核心思路:
**最终代码:
#include<iostream>
#include<vector>
#include <cstring>
using namespace std;
int n,k;
char arr[9][9];
long long ans = 0;
int cl[9] = {0};
void dfs(int cur,int s){
if(cur>k){
if(s==k) ans++;
return ;
}
//一排一排的搜
for(int i = 0;i<n;i++){
if(arr[cur][i]=='#'&&cl[i]==0){
cl[i] = 1;//选了
dfs(cur+1,s+1);
cl[i] = 0;//回溯
}
}
dfs(cur+1,s);
}
int main(){
while(cin>>n>>k&&(n!=-1&&k!=-1)){
memset(cl,0,sizeof(cl));
int cnt =0 ;
ans = 0;
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
cin>>arr[i][j];
if(arr[i][j]=='#') cnt++;
}
}
if(cnt==k){
cout<<1<<endl;
continue;
}
dfs(0,0);
cout<<ans<<endl;
}
return 0;
}学到的点:
- 回溯