題目描述:
在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對於給定形狀和大小的棋盤,擺放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;
}
思路:搜索問題,棋子少於棋盤的行數時,要不斷地遞歸和回溯。