[ACM_图论] 棋盘问题 (棋盘上放棋子的方案数)

不能同行同列,给定形状和大小的棋盘,求摆放k个棋子的可行方案

Input

2表示是2X2的棋盘,1表示k,#表示可放,点不可放(-1 -1 结束)

Output

输出摆放的方案数目C

Sample Input

2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

Sample Output

2
1
 
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<string>
#include<string.h>
#include<fstream>
using namespace std;
//***********************************************************************
int n,uu,sum,ans;//n为nxn棋盘,uu为要放棋子数,sum为过程中当前棋子数
int G[10][10],visH[10],visL[10];//G[][]棋盘0-1描述矩阵,vis_[]标记当前行列是否可下棋
//***********************************************************************
void DFS(int i,int j){
    if(sum==uu){ans++;return;}
    for(int k=i+1;k<n;k++)
        for(int l=0;l<n;l++){
            if(G[k][l] && !visH[k] && !visL[l]){
                visH[k]=visL[l]=1;
                sum++;
                DFS(k,l);
                sum--;
                visH[k]=visL[l]=0;
            }
        }
}
//***********************************************************************
int main(){
    string s;
    while(cin>>n>>uu){
        if(n==-1 && uu==-1)break;

        for(int i=0;i<n;i++){       //输入数据并转换0-1可放表G[][]
            cin>>s;
            for(int j=0;j<n;j++)
                G[i][j]=(s[j]=='#');
        }

        memset(visH,0,sizeof(visH));//行、列标记数组清0,ans初始0
        memset(visL,0,sizeof(visL));
        ans=0;
        DFS(-1,0);

        cout<<ans<<'\n';
    }return 0;
}
View Code

 

posted @ 2013-08-16 19:54  beautifulzzzz  阅读(935)  评论(0编辑  收藏  举报