/*秋雪占座位问题
秋雪是一个可爱的女孩子,她的宿舍包括她在内有K(K<<N)个女孩子
平常她们上课的时候一定要坐在一起,而且必须要在同一行。
教室有M行N列座位,有的时候有些座位已经被人给占了。
请问秋雪有多少种占座的可能。
NOTE:M N K由你输入
*/
0 表示 座位未被占领
1 表示座位以被占
#include <stdio.h>
/*秋雪占座位问题
秋雪是一个可爱的女孩子,她的宿舍包括她在内有K(K<<N)个女孩子
平常她们上课的时候一定要坐在一起,而且必须要在同一行。
教室有M行N列座位,有的时候有些座位已经被人给占了。
请问秋雪有多少种占座的可能。
NOTE:M N K由你输入
*/
#define M 6
#define N 7
void Write(int a[][N], int m);
int Ways(int a[][N], int n, int m);
int main(int argc, char * argv[])
{
int a[M][N], k;
printf("Enter the array (%d * %d) with %d figures.(1 / 0)\n", M, N, N * M);
Write( a, M);
printf("Please enter the k.\n");
scanf("%d", &k);
printf("There are %d ways.\n", Ways(a, M, k));
return 0;
}
/*
Write 写入数组
@a: 数组名
@n:数组元素的个数
返回值:无
*/
void Write(int a[][N], int m)
{
int i, j;
for(i = 0; i < m; i++)
{
for(j = 0; j < N; j++)
{
scanf("%d", &a[i][j]);
}
}
}
/* Ways 计算秋雪占座的可能性
@a : 教室的位置的分布
@n : 教室的列数
@m : 秋雪宿舍的人数
返回值:占座的可能数
*/
int Ways(int a[][N], int n, int m)
{
int i, j, count, ways = 0, c;
for(i = 0; i < n; i++)
{
for(j = 0; j < N; j++)
{
count = 0;
c = j;
while ( c < N && a[i][c] == 0)
{
count++;
c++;
if( count % m == 0)
{
ways++;
printf("(%d, %d)->(%d,%d)\n", i, j, i, c-1);
break;
}
}
}
}
return ways;
}