poj1321——棋盘问题

来源:互联网 发布:手机淘宝购物流程 编辑:程序博客网 时间:2024/06/15 20:25

题目大意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,问摆放k个棋子的所有可行的摆放方案个数。

输入:(多个case)

            棋盘行列数n 棋子个数k(-1 -1表示结束,n<=8,k<=n)

            棋盘第i行形状(#表示棋盘区域 .表示空白区域)

输出:摆放方案个数

分析:深度优先搜索,与八皇后类似,但是只限制了行列不冲突,dfs第i层,看哪一列能摆放棋子。

代码:转载自http://blog.csdn.net/acmer_sly/article/details/52494797

  1. #include<stdio.h>  
  2. #include<string.h>  
  3. int n,k;  
  4. char map[10][10];  
  5. int vis[10];  
  6. int count;  
  7. void Dfs(int index,int num)  
  8. {  
  9.     if(index>=n&&num!=0)return;         
  10.     if(num>n-index)return;   //一个剪枝,即如果剩下的行数<剩下的棋子数,  
  11.                              // 那这种方案肯定不行,就直接return结束  
  12.     if(num==0){     //棋子按要求放完了,即又找到了一种方案  
  13.         count++;  
  14.         return;  
  15.     }  
  16.     int i;  
  17.     for(i=0;i<n;i++){  
  18.         if(map[index][i]=='.')continue;  
  19.         if(vis[i])continue;  
  20.         vis[i]=1;      //标记列  
  21.         Dfs(index+1,num-1); //表示这一行要放棋子  
  22.         vis[i]=0;  
  23.     }  
  24.     Dfs(index+1,num);    //表示这一行不放棋子  
  25. }  
  26. int main()  
  27. {  
  28.     int i;  
  29.     while(scanf("%d %d",&n,&k)!=EOF){  
  30.         if(n==-1&&k==-1)break;  
  31.         count=0;  
  32.         for(i=0;i<n;i++){  
  33.             scanf("%s",map[i]);  
  34.         }  
  35.         memset(vis,0,sizeof(vis));  
  36.         Dfs(0,k);  
  37.         printf("%d\n",count);  
  38.     }  
  39.     return 0;  
  40. }

原创粉丝点击