• 棋盘问题(dfs)(类似8皇后)


    在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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

    ac代码:

    #include <stdio.h>  
    #include <string.h>  
    #include <stdlib.h>  
    #include <iostream>  
    #include <algorithm>  
    #include <set>  
    #include <queue>  
    #include <stack>  
      
    using namespace std;  
    char map[10][10];  
    int vis[10];//第i列是否放置了棋子  
    int cnt;//已放棋子的数目  
    int sum;//放置方法的总数  
    int n,k;  
    void dfs(int s)  
    {  
        int i;  
        if(cnt==k){//所有的棋子都放置好  
            sum++;  
            return ;  
        }  
        else{  
            if(s>=n)//如果越界  
                return ;//返回  
            else{  
                for(i=0;i<n;i++){//讲一个棋子尝试放在0-n-1列的某一行  
                    if(map[s][i]=='#'&&!vis[i]){  
                        vis[i]=1;//标记该列已经放了棋子  
                        cnt++;//棋子数+1  
                        dfs(s+1);//继续搜索  
                        cnt--;//经过一轮递归后num始终保持不变,因为没有放棋子  
                        vis[i]=0;//在此处不放棋子  
                    }  
                }  
                dfs(s+1);//进行剩下的k-1个棋子的遍历  
            }  
        }  
    }  
    int main()  
    {  
        int i;  
        while(~scanf("%d %d",&n,&k)){  
                getchar();  
            if(n==-1&&k==-1) break;  
            memset(vis,0,sizeof(vis));  
            for(i=0;i<n;i++)  
                scanf("%s",map[i]);  
        cnt=sum=0;  
            dfs(0);  
            printf("%d
    ",sum);  
        }  
        return 0;  
    }


  • 相关阅读:
    又快又准的sql瓶颈诊断方法
    Qps从300到1500的优化过程
    Mysql性能优化全揭秘-庖丁解牛
    java学习笔记16-抽象类
    java学习笔记15-封装
    java学习笔记14-多态
    java学习笔记13-重写与重载
    Git学习笔记08-远程仓库
    Python3+Appium学习笔记09-元素定位android_uiautomator
    Python3+Appium学习笔记08-元素定位
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11746077.html
Copyright © 2020-2023  润新知