日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

棋盘问题 dfs

發布時間:2024/8/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 棋盘问题 dfs 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
棋盤問題
Time Limit:?1000MS?Memory Limit:?10000K
Total Submissions:?38265?Accepted:?18742

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

Sample Output

2 1

//#include <iostream>
//#include<cstring>
//#include<cstdio>
//using namespace std;
//char Map[9][9];
//int lie[9];
//int n,k;
//int sum;
//void dfs(int start,int num)
//{
// ? ?for(int i=0;i<n;i++)
// ? ?{
// ? ? ? if(lie[i]==0&&Map[start][i]=='#')
// ? ? ? ?{
// ? ? ? ? ? if(num==1)
// ? ? ? ? ? sum++;
// ? ? ? ? ? else {
// ? ? ? ? ? lie[i]=1;
// ? ? ? ? ? for(int j=start+1;j<n-num+2;j++)
// ? ? ? ? ? ? ? dfs(j,num-1);
// ? ? ? ? ? ? ? lie[i]=0;
// ? ? ? ? ? }
// ? ? ? ?}
// ? ?}
//}
//int main()
//{
// ? while(cin>>n>>k)
// ? {
// ? ? ?memset(lie,0,sizeof(lie));
// ? ? ? for(int i=0;i<n;i++)
// ? ? ? for(int j=0;j<n;j++)
// ? ? ? cin>>Map[i][j];
// ? ? ? sum=0;
// ? ? ? for(int i=0;i<=n-k;i++)
// ? ? ? {
// ? ? ? ?dfs(i,k);
// ? ? ? }
// ? ? ? cout<<sum<<endl;
//
// ? }
// ? ?return 0;
//}
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
char Map[10][10];
int cnt,n,k;
int lie[10];
void dfs(int x,int cur)
{
? ?if(cur==k)
? ? { ?cnt++;return;
? ?}
? ?else
? ?{
? ? ? ?for(int i=x;i<n;i++)
? ? ? ? ? for(int j=0;j<n;j++)
? ? ? ? ? {
? ? ? ? ? ? ? if(Map[i][j]=='#'&&!lie[j])
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? lie[j]=1;
? ? ? ? ? ? ? ? dfs(i+1,cur+1);
? ? ? ? ? ? ? ? lie[j]=0;
? ? ? ? ? ? ? }
? ? ? ? ? }
? ?}
}
int main()
{
? ?int i,j;
? ?while(cin>>n>>k)
? ?{
? ? ? if(n==-1||k==-1)
? ? ? ?break;
? ? ? ?for(i=0;i<n;i++)
? ? ? ?{
? ? ? ? ? for(j=0;j<n;j++)
? ? ? ? ? cin>>Map[i][j];
? ? ? ?}
? ? ? ?cnt=0;
? ? ? ?memset(lie,0,sizeof(lie));
? ? ? ?dfs(0,0);
? ? ? ?printf("%d\n",cnt);
? ?}


}


總結

以上是生活随笔為你收集整理的棋盘问题 dfs的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。