• POJ1321-棋盘问题


    【题目描述】

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

    【输入】

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

    【输出】

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

    【输入示例】

    2 1

    #.

    .#

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

    【输出示例】

    2

    1

    【思路】

    这是一道深搜、递归题。

    在找到一个棋子后,标记它所在的列,再搜索它后边的一列。

    【代码】

    #include<iostream>
    using namespace std;
    int m,n,cnt=0;
    bool flag[10];
    char Map[10][10];
    void fz(int x,int d)//搜索一列
    {
        if(n==d)//棋子放完
        {
            cnt++;
            return;
        }
        if(x>=m)//越出边界
            return;
        int i,j;
        for(i=0; i<m; i++)
        {
            if(!flag[i]&&Map[x][i]=='#')//那一列没走过并且可以放 
            {
                flag[i]=1;
                fz(x+1,d+1);
                flag[i]=0;
            }
        }
        fz(x+1,d);//搜索下一列 
    }
    int main()
    {
        while(cin>>m>>n&&m!=-1&&n!=-1)
        {
            int i,j;
            for(i=0; i<m; i++)
                cin>>Map[i];
            memset(flag,0,sizeof(flag));
            cnt=0;
            fz(0,0);
            cout<<cnt<<endl;
        }
        return 0;
    }

    你知道我是怎么做题的吗:

  • 相关阅读:
    [HAOI2010]软件安装
    「HNOI2015」菜肴制作
    [ZJOI2007] 小Q的矩阵游戏 (模板—Dinic)
    「POI2012」约会 Rendezvous
    [APIO2016]划艇
    [CQOI2011]放棋子
    【SDOI2015】bzoj3990 排序
    [bzoj2242] [SDOI2011]计算器
    模板—BSGS
    【BZOJ1227】[SDOI2009]虔诚的墓主人
  • 原文地址:https://www.cnblogs.com/4D24/p/9454716.html
Copyright © 2020-2023  润新知