• POJ1321 棋盘问题(简单搜索)


    题意:

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

    题解:

           八皇后问题的变形,回溯法解决。

    代码:

    #include <iostream>
    
    using namespace std;
    int n,k,maxn,sum;
    char a[9][9];
    
    int canplace(int r,int c)          //判断棋子能否放置。
    {
        int i;
        if(a[r][c]=='.') return 0;
        for(i=r-1;i>=0;i--)
            if(a[i][c]=='Q') return 0;
        for(i=c-1;i>=0;i--)
            if(a[r][i]=='Q') return 0;
        return 1;
    }
    
    void dfs(int m)
    {
        if(k==sum)       //当要求棋子数与放置的总数相同时,回溯。
        {
            maxn++;
            return ;
        }
        if(m>=n*n)       //当遍历完整个棋盘,回溯。
            return;
        else
        {
            int r,c;
            r=m/n;
            c=m%n;
            if(canplace(r,c))
            {
                a[r][c]='Q';
                sum++;
                dfs(m+1);
                a[r][c]='#';
                sum--;
            }
            dfs(m+1);
        }
    }
    
    int main()
    {
        int i,j;
        while(cin>>n>>k)
        {
            if(n==-1&&k==-1) break;
            maxn=0;
            sum=0;
            for(i=0;i<n;i++)
                for(j=0;j<n;j++)
                cin>>a[i][j];
            dfs(0);
            cout<<maxn<<endl;
        }
    
        return 0;
    }
  • 相关阅读:
    HDU X mod f(x)(题解注释)
    hdu 3555 Bomb(不要49,数位DP)
    hdu 2089 不要62(入门数位dp)
    暑假练习赛 003 B Chris and Road
    暑假练习赛 003 F Mishka and trip
    暑假练习赛 003 A Spider Man
    linux:关于Linux系统中 CPU Memory IO Network的性能监测
    linux TCP数据包重传过程----小结
    linux TCP头部的构造的简单分析
    linux TCP数据包封装在SKB的过程分析
  • 原文地址:https://www.cnblogs.com/y1040511302/p/10177911.html
Copyright © 2020-2023  润新知