Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 12028 | Accepted: 5924 |
Description
Input
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
Sample Input
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
Sample Output
2 1
#include<stdio.h>
struct node{
int x,y;
}str[109];
int n,m,sum,num;
char map[10][10];
int cheak(int i)//判断是不是在同行或同列
{
int j;
for(j=0;j<n;j++)
if(map[str[i].x][j]=='0'||map[j][str[i].y]=='0')
return 0;
return 1;
}
void dfs(int step,int p)//深搜
{
int i;
if(step==m)
{
sum++;
return;
}
for(i=p;i<num;i++)
{
if(cheak(i)==1)
{
map[str[i].x][str[i].y]='0';
dfs(step+1,i+1);
map[str[i].x][str[i].y]='1';
}
}
}
int main()
{
int i,j;
while(scanf("%d%d",&n,&m),n!=-1||m!=-1)
{
num=0;
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
for(j=0;j<n;j++)
if(map[i][j]=='#')
{
str[num].x=i;
str[num].y=j;
num++;
}
}
sum=0;
dfs(0,0);
printf("%d\n",sum);
}
return 0;
}