zoukankan      html  css  js  c++  java
  • 棋盘问题

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

    Input

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

    Output

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

    Sample Input

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

    Sample Output

    2
    1

    用深搜搜索每一行,遇到 ‘#’ 1.num++,2.开始搜索下一行。(dfs(row+1,num+1)
    在num == k 的时候, sum++。
    最后面要dfs(row+1,num) 当k小于n的时候,前面只能满足从1-k的递归。这里可以从2-k+1 一直到 n-k 到 n递归。
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int vis[10]; //每一列里面不能重复放棋子,所以这里用一维数组。
    char map1[10][10];
    int sum;
    int n,k;
    
    void dfs(int row, int num){
    	if(num == k) {
    		sum++;return;
    	}
    	if(row > n) return;
    	
    	for(int i = 0; i < n; i++)
    		if(map1[row][i] == '#' && !vis[i]){
    			vis[i] = 1;
    			dfs(row+1,num+1);
    			vis[i] = 0;
    		}
    	dfs(row+1,num);//k 小于 n 的时候从row+1开始递归 
    	return;
    }
     
    
    int main(){
    	
    	while(cin>>n>>k){
    		sum = 0;
    		memset(vis,0,sizeof(vis));
    		memset(map1,0,sizeof(map1));
    		if(n == -1 && k == -1) break;
    		getchar();
    		for(int i = 0; i < n; i++)
    			gets(map1[i]);
    		dfs(0,0);
    		cout<<sum<<endl;
    	}
    	return 0;
    } 
    
  • 相关阅读:
    网络初级篇之STP(BPDU详解与STP故障恢复)
    网络初级篇之STP(实验验证)
    3-1 查看帮助,命令历史与快捷键
    2-1 bash基本特性
    2-0 虚拟机与Linux系统安装
    0.操作系统的获取与安装
    1.计算机基础
    Linux下打包、压缩和解压
    JAVA基本数据类型转换的注意事项
    EditPlus代码自动完成的设置
  • 原文地址:https://www.cnblogs.com/stul/p/9979680.html
Copyright © 2011-2022 走看看