• C语言编程练习59:棋盘问题


    题目描述

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

    输入

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

    输出

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

    样例输入 

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

    样例输出

    2
    1

    思路:从第一排开始摆,一排摆一个,标记摆的位置的列。
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    char s[9][9];
    int vis[50];
    int n,k;
    int ans;
    void dfs(int a,int b)
    {
        if(b==0)
        {
            ans++;
            return;
        }
        for(int i=a;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(s[i][j]=='#'&&vis[j]==0)
                {
                    vis[j]=1;
                    dfs(i+1,b-1);
                    vis[j]=0;
                }
                else
                {
                    continue;
                }
                
            }
        }
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&k)!=EOF)
        {
            if(n==-1&&k==-1)
            {
                break;
            }
            for(int i=0;i<n;i++)
            {
                scanf("%s",&s[i]);
            }   
            memset(vis,0,sizeof(vis));
            ans=0;
            dfs(0,k);
            printf("%d
    ",ans);
        }
    }
    
     
  • 相关阅读:
    Count and Say leetcode
    Find Minimum in Rotated Sorted Array II leetcode
    Find Minimum in Rotated Sorted Array leetcode
    Search in Rotated Sorted Array II leetcode
    search in rotated sorted array leetcode
    Substring with Concatenation of All Words
    Subsets 子集系列问题 leetcode
    Sudoku Solver Backtracking
    Valid Sudoku leetcode
    《如何求解问题》-现代启发式方法
  • 原文地址:https://www.cnblogs.com/FantasticDoubleFish/p/14438258.html
Copyright © 2020-2023  润新知