poj 1321
题目大意:
解决:dfs+回溯,类似于八皇后问题,分两种情况,第n行放或者不放,放的话回溯,不放的话直接进入下一行
#include <iostream> #include <cstdio> using namespace std; int cnt,n,k; char map[10][10]; int r[10],c[10]; void dfs(int cur_step,int cur_cnt) { if(cur_cnt == k){cnt++;return;} if(cur_step == n)return; for(int i=0;i<n;i++) { if(map[cur_step][i]=='#' && !r[cur_step] && !c[i]) { r[cur_step]=1; c[i]=1; dfs(cur_step+1,cur_cnt+1); r[cur_step]=0; c[i]=0; } } //由于是多行,可能某一行不用放,这种情况是解决在cur_step行没放 //而直接进入下一行的情况 dfs(cur_step+1,cur_cnt); } int main() { while(scanf("%d%d",&n,&k), n!=-1 && k!=-1) { memset(r,0,sizeof(r)); memset(c,0,sizeof(c)); cnt=0; int i; for(i = 0; i < n; i++)scanf("%s",map[i]); dfs(0,0); printf("%d\n",cnt); } system("pause"); return 0; }