1.题目链接:https://vjudge.net/contest/65959#overview
A - 棋盘问题
POJ - 1321每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1Sample Output
2 1
2.代码解析:
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,k;
char mapp[10][10];//记录地图
int book[10];//标记某一行是否走过
int cnt,ans;//cnt时当前已经安排几个棋子,sum时方法数
void dfs(int s)
{
if(cnt==k)//当前已被安排的棋子==k时
{
ans++;
return ;
}
if(s>=n)//s代表行数,说明越界
return;
for(int i=0; i<n; i++)
{
if(book[i]==0&&mapp[s][i]=='#')//没走过这一行&&可以放棋子
{
book[i]=1;
cnt++;
dfs(s+1);
cnt--;
book[i]=0;
}
}
dfs(s+1);//下一行
}
int main()
{
while(scanf("%d %d",&n,&k)!=EOF)
{
if(n==-1&&k==-1)
break;
for(int i=0; i<n; i++)
cin>>mapp[i];//用cin比较方便,省去读空格的步骤
//初始化非常重要
memset(book,0,sizeof(book));
cnt=0,ans=0;
//从第零行开始
dfs(0);
printf("%d\n",ans);
}
}
711

被折叠的 条评论
为什么被折叠?



