這題想了好久,看了八皇后問題,這題比八皇后問題麻煩的地方是:棋子少於棋盤的行數時,要不斷地遞迴和回溯。直接上代碼(沒有任何剪枝)
#include<iostream><br />using namespace std;<br />int board[9][9],col[9],count;<br />void dfs(int n,int k,int line)//k是當前剩餘的棋子數,line是當前要試探的行<br />{<br />int i,j;<br />for(j=1;j<=n;j++)<br />if(board[line][j]&&!col[j])<br />{<br />if(k==1)<br />{<br />count++;<br />continue;<br />}<br />col[j]=1;<br />for(i=line+1;i<=n;i++)<br />dfs(n,k-1,i);<br />col[j]=0;<br />}<br />}<br />int main()<br />{<br />int b,num,c,r;<br />char chr;<br />while(scanf("%d%d",&b,&num))<br />{<br />if(b==-1&&num==-1)<br />break;<br />getchar();<br />for(r=1;r<=b;r++)<br />{<br />for(c=1;c<=b;c++)<br />{<br />scanf("%c",&chr);<br />if(chr=='#')<br />board[r][c]=1;<br />else<br />board[r][c]=0;<br />}<br />getchar();<br />}<br />if(num==0||b==0)<br />{<br />printf("0/n");<br />continue;<br />}<br />count=0;<br />for(r=1;r<=b-num+1;r++)<br />{<br />memset(col,0,sizeof(col));<br />dfs(b,num,r);<br />}<br />printf("%d/n",count);<br />}<br />return 0;<br />}