程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> POJ 1321-棋盤問題(DFS 遞歸),poj1321-

POJ 1321-棋盤問題(DFS 遞歸),poj1321-

編輯:關於C語言

POJ 1321-棋盤問題(DFS 遞歸),poj1321-


                  POJ 1321-棋盤問題

K - DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u  

Description

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

Input

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

Output

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

Sample Input

2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

題解:看到的第一眼,我就覺得和n皇後問題很像,再仔細一看,就是很像啊,方法相同,遞歸思想,只是本題只要判斷不在一行或者一列,規定了棋子放置位置,故要增加判斷條件。
可先看n皇後問題再做此題。
DFS 遞歸

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[10][10];     //記錄棋盤位置
int book[10];        //記錄一列是否已經放過棋子
int n,k;
int total,m;    //total 是放棋子的方案數 ,m是已放入棋盤的棋子數目

void DFS(int cur)
{
    if(k==m)
    {
        total++;
        return ;
    }
    if(cur>=n)    //邊界
return ; for(int j=0; j<n; j++) if(book[j]==0 && a[cur][j]=='#') //判斷條件 { book[j]=1; //標記 m++; DFS(cur+1); book[j]=0; //改回來方便下一行的判斷 m--; } DFS(cur+1); //到下一行 } int main() { int i,j; while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1) //限制條件 { total=0; m=0; for(i=0; i<n; i++) scanf("%s",&a[i]); memset(book,0,sizeof(book)); DFS(0); printf("%d\n",total); } return 0; }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved