[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<<'\n';
    }return 0;
}
View Code
复制代码

 

posted @   beautifulzzzz  阅读(937)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示