算法提高 棋盘多项式

/*
问题描述
八皇后问题是在棋盘上放皇后,互相不攻击,求方案。变换一下棋子,还可以有八车问题,八马问题,八兵问题,八王问题,注意别念反。在这道题里,棋子换成车,同时棋盘也得换,确切说,是进行一些改造。比如现在有一张n*n的棋盘,我们在一些格子上抠几个洞,这些洞自然不能放棋子了,会漏下去的。另外,一个车本来能攻击和它的同行同列。现在,你想想,在攻击的过程中如果踩到一个洞,便会自取灭亡。故,车的攻击范围止于洞。
此题,给你棋盘的规模n,以及挖洞情况,求放k个车的方案数(k从0到最多可放车数)
输入格式
第一行一个整数n表示棋盘大小
接下来n行,每行n个用空格隔开的数字0或1,0的形状表示洞,1表示没有洞
输出格式
若干行,第i行表示放i个车的方案数
样例输入
3
1 0 1
1 1 1
1 0 1
样例输出
7
12
4
数据规模和约定
n<=8
*/

#include<stdio.h>
void shuru( int [][9] , int );
void shuchu( int [][9] , int );
void jisuan( int [][9] , int , int , int , int , int , int * );
int check( int [][9] , int , int );
int main(void)
{
	int n ;
	scanf("%d", &n);
	int sz[9][9];
	shuru( sz  , n );
	shuchu( sz , n );
	return 0;
}
int check( int sz[][9] , int dqh , int dql )
{
	int i , j ;
	for( i = dqh - 1 ; i >= 0 ; i -- )
	{
		if( sz[i][dql] == 0 || sz[i][dql] == 2 )
		{
			break;
		}
	} 
	for( j = dql - 1 ; j >= 0 ; j -- )
	{
		if( sz[dqh][j] == 0 || sz[dqh][j] == 2 )
		{
			break;
		}
	}
	if( sz[i][dql] == 2 || sz[dqh][j] == 2 )
	{
		return 0;
	}
	return 1;
}

void jisuan( int sz[][9] , int n , int dqh , int dql , int s , int gs , int * sum )
{
	if( s == gs )
	{
		++ * sum ;
		return ;
	}
	if( dqh == n )
	{
		return ;
	}
	int i ;
	for( i = dql ; i < n ; i ++ )
	{
		if( sz[dqh][i] != 0 ) 
		{
			if(check( sz , dqh , i ) == 1 )
			{
				sz[dqh][i] =  2;
				jisuan( sz , n , dqh , i + 1 , s + 1 , gs , sum ); 
				sz[dqh][i] =  1;   
			}
		}
	}
	jisuan( sz , n , dqh + 1 , 0 , s , gs , sum );
}
void shuchu( int sz[][9] , int n)
{
	int i = 1;
	while(  i <= n * n )
	{
		int sum = 0  ;
		jisuan( sz , n , 0 , 0 , 0 , i , &sum );
		if( sum == 0 )      
		{
			break ;
		}
		printf("%d\n", sum );
		i ++ ; 
	}
}
void shuru( int sz[][9] , int n )
{
	int i , j;
	for( i = 0 ; i < n ; i ++ )
	{
		for( j = 0 ; j < n ; j ++ )
		{
			scanf("%d", & sz[i][j] ) ;
		}
	}
} 

猜你喜欢

转载自blog.csdn.net/qq_41353167/article/details/81626280