标签:
题目链接:http://poj.org/problem?id=1321
题目大意和N皇后类似,只不过可能出现K<N的情况。
按照行的顺序进行深搜,如果当前行可以放置棋子,则换下一行进行搜索。
用一个二维数组描述棋盘,一个一维数组标记此列是否走过。
1 #include<cstdio> 2 #include<cstdlib> 3 4 const int MAXN=8; 5 char m[MAXN][MAXN]; //记录棋盘 6 int vis[MAXN]; //标记每一列是否访问过 7 int n,k,res; 8 9 void dfs(int cur,int num)//cur为当前行,num为当前放置好的棋子数目 10 { 11 if(num==k) //如果所有棋子都已放好,则结果加1,返回 12 { 13 res++; 14 return; 15 } 16 17 if(cur>=n) return;//防止搜索越界 18 19 for(int i=cur;i<n;i++) 20 { 21 for(int j=0;j<n;j++) 22 { 23 if(m[i][j]==‘#‘ && vis[j]==0) 24 { 25 vis[j]=1;//放好当前行时,将当前列标记为走过 26 dfs(i+1,num+1);//如果当前行放好了,则换下一行,num+1 27 vis[j]=0;//递归结束后复原 28 } 29 } 30 } 31 } 32 33 int main() 34 { 35 while(scanf("%d %d",&n,&k)!=EOF) 36 { 37 getchar(); 38 if(n==-1 && k==-1) break; 39 40 for(int i=0;i<n;i++) 41 { 42 for(int j=0;j<n;j++) 43 { 44 scanf("%c",&m[i][j]); 45 } 46 getchar(); 47 } 48 for(int i=0;i<n;i++) //初始状态下每一列标记都置为0 49 { 50 vis[i]=0; 51 } 52 res=0; 53 dfs(0,0); //第一个0为从二维数组的第0行开始搜索,第二个0为当前放置了0个棋子 54 printf("%d\n",res); 55 } 56 return 0; 57 }
标签:
原文地址:http://www.cnblogs.com/Page3/p/4641705.html