zoukankan      html  css  js  c++  java
  • [ACM_图论] 棋盘问题 (棋盘上放棋子的方案数)

    不能同行同列,给定形状和大小的棋盘,求摆放k个棋子的可行方案

    Input

    2表示是2X2的棋盘,1表示k,#表示可放,点不可放(-1 -1 结束)

    Output

    输出摆放的方案数目C

    Sample Input

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

    Sample Output

    2
    1
     
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<string>
    #include<string.h>
    #include<fstream>
    using namespace std;
    //***********************************************************************
    int n,uu,sum,ans;//n为nxn棋盘,uu为要放棋子数,sum为过程中当前棋子数
    int G[10][10],visH[10],visL[10];//G[][]棋盘0-1描述矩阵,vis_[]标记当前行列是否可下棋
    //***********************************************************************
    void DFS(int i,int j){
        if(sum==uu){ans++;return;}
        for(int k=i+1;k<n;k++)
            for(int l=0;l<n;l++){
                if(G[k][l] && !visH[k] && !visL[l]){
                    visH[k]=visL[l]=1;
                    sum++;
                    DFS(k,l);
                    sum--;
                    visH[k]=visL[l]=0;
                }
            }
    }
    //***********************************************************************
    int main(){
        string s;
        while(cin>>n>>uu){
            if(n==-1 && uu==-1)break;
    
            for(int i=0;i<n;i++){       //输入数据并转换0-1可放表G[][]
                cin>>s;
                for(int j=0;j<n;j++)
                    G[i][j]=(s[j]=='#');
            }
    
            memset(visH,0,sizeof(visH));//行、列标记数组清0,ans初始0
            memset(visL,0,sizeof(visL));
            ans=0;
            DFS(-1,0);
    
            cout<<ans<<'
    ';
        }return 0;
    }
    View Code
  • 相关阅读:
    scala与java的区别
    寒假第四天
    冲刺(第六天)
    冲刺(第五天)
    冲刺(第四天)
    冲刺(第三天)
    冲刺(第二天)
    第十周总结
    冲刺(第一天)
    文本中单词统计
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3263455.html
Copyright © 2011-2022 走看看