棋盤問題

題目描述:

在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對於給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案C

輸入:

輸入含有多組測試數據。
每組數據的第一行是兩個正整數,n k,用一個空格隔開,表示了將在一個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n
當爲-1 -1時表示輸入結束。
隨後的n行描述了棋盤的形狀:每行有n個字符,其中 # 表示棋盤區域, . 表示空白區域(數據保證不出現多餘的空白行或者空白列)       

輸出:

對於每一組數據,給出一行輸出,輸出擺放的方案數目C (數據保證C<2^31)

代碼如下:

#include<iostream>
using namespace std;
int board[9][9],col[9],count;
void dfs(int n,int k,int line)//k是當前剩餘的棋子數,line是當前要試探的行
{
	int i,j;
	for(j=1;j<=n;j++)
		if(board[line][j]&&!col[j])
		{
			if(k==1)
			{
				count++;
				continue;
			}
			col[j]=1;
			for(i=line+1;i<=n;i++)
					dfs(n,k-1,i);
			col[j]=0;
		}
}
int main()
{
	int b,num,c,r;
	char chr;
	while(scanf("%d%d",&b,&num))
	{
		if(b==-1&&num==-1)
			break;
		getchar();
		for(r=1;r<=b;r++)
		{
			for(c=1;c<=b;c++)
			{
				scanf("%c",&chr);
				if(chr=='#')
					board[r][c]=1;
				else
					board[r][c]=0;
			}
			getchar();
		}
		if(num==0||b==0)
		{
			printf("0/n");
			continue;
		}
		count=0;
		for(r=1;r<=b-num+1;r++)
		{
			memset(col,0,sizeof(col));
			dfs(b,num,r);
		}
		printf("%d/n",count);
	}
	return 0;
}

思路:搜索問題,棋子少於棋盤的行數時,要不斷地遞歸和回溯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章