POJ - 1321 棋盘问题

来源:互联网 发布:淘宝十大男模特 编辑:程序博客网 时间:2024/05/18 00:59

题目介绍:
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

Input
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。

Output
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。

2 1#..#4 4...#..#..#..#...-1 -1Sample Output21

题目不难,尝试所有的情况,采用DFS较为简单,因为要不同行,不同列所以只需要加上列的访问标记即可,行在递归时就已经区别开了。
一定要注意访问完列后将标记重新设置为未访问状态

    #include<iostream>        #include<cstring>        #include<stdio.h>        using namespace std;         char A[8][8];        int row[8];//列标志        int n,k,count;//方法数         void DFS(int line,int num){            //棋子已放完             if(num == k){                count++;                return;            }            for(int i=line ; i<n ; ++i){                 for(int j=0 ; j<n ; j++){                    //找到可以放的位置                     if(!row[j] && A[i][j]=='#'){                        //递归进行下一行遍历,棋子数同时减一                         row[j]=1;                         DFS(i+1,num+1);                        row[j]=0;                     }                }            }           }         int main(void){            while(cin>>n>>k,n!=-1){                for(int i=0 ; i<n ; ++i){                    cin>>A[i];                 }                //初始化列标志与方法数                count = 0;                memset(row,0,n);                //从0,0位置开始遍历                 DFS(0,0);                 cout<<count<<endl;             }            return 0;        } 
0 0
原创粉丝点击