棋盘问题 dfs
棋盤問題
每組數據的第一行是兩個正整數,n k,用一個空格隔開,表示了將在一個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n?
當為-1 -1時表示輸入結束。?
隨后的n行描述了棋盤的形狀:每行有n個字符,其中 # 表示棋盤區域, . 表示空白區域(數據保證不出現多余的空白行或者空白列)。?
//#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);
? ?}
}
| 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 -1Sample 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);
? ?}
}
總結
- 上一篇: CNN(Convolutional Ne
- 下一篇: 最小生成树的Prime算法的思想