POJ1321 棋盘游戏
分析:是八皇后问题的简化版,只用判断行列有无放置棋子,与八皇后问题的不同之处在于,某一列可以不放置棋子,棋子只能放置在有棋盘空格的地方。
因为某一列可以不放棋子,所以每次搜完这一列要到下一列,注意判断边界条件。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 char g[10][10]; 9 bool vis[10][10],line[10]; 10 int n,k,ans,num; 11 12 inline void dfs(int pos,int cnt) 13 { 14 if(pos>n) return; 15 for(int i=1;i<=n;i++) 16 { 17 if(g[pos][i]!='#') continue; 18 else if(line[i]) continue; 19 else if(!line[i]) 20 { 21 line[i]=true; 22 if(cnt+1==k) ans++; 23 else dfs(pos+1,cnt+1); 24 line[i]=false; 25 } 26 } 27 dfs(pos+1,cnt); 28 } 29 30 int main() 31 { 32 while(1) 33 { 34 scanf("%d%d",&n,&k); 35 if(n==-1&&k==-1) return 0; 36 for(int i=1;i<=n;i++) 37 for(int j=1;j<=n;j++) 38 cin>>g[i][j]; 39 memset(vis,false,sizeof(vis)); 40 memset(line,false,sizeof(line)); 41 ans=0; 42 dfs(1,0); 43 printf("%d\n",ans); 44 } 45 return 0; 46 }