问题描述
用2×1或1×2的骨牌把m×n的棋盘完全覆盖是一个很容易解决的问题,把完全覆盖的种数求出来,解出给出所有各不相同覆盖方案。
给定任意m行n列的棋盘,编写程序求出使用2×1或1×2的骨牌对棋盘进行完全覆盖有多少种不同的方法。
算法选择
排列组合算法
实现语言
C++
实现代码
#include <iostream>
using namespace std;
int m,n; // 长宽
bool **Chess; // 棋盘
int Count=0; // 计数
void Domino(int i,int j){
if(i==m){Count++;return;} // 完成
if(j==n-1){ // 当前方格位于最后一列
if(Chess[i][j]==0){ // 尚未放置
if(i!=m-1&&Chess[i+1][j]==0){ // 下方可以放置
Chess[i][j]=Chess[i+1][j]=1; // 放置
Domino(i+1,0); // 换行
Chess[i][j]=Chess[i+1][j]=0; // 恢复
}
}
else Domino(i+1,0); // 换行
}
else{ // 当前方格不在最后一列
if(Chess[i][j]==0){ // 尚未放置
if(i!=m-1&&Chess[i+1][j]==0){ // 下方可以放置
Chess[i][j]=Chess[i+1][j]=1; // 放置
Domino(i,j+1); // 右移
Chess[i][j]=Chess[i+1][j]=0; // 恢复
}
if(Chess[i][j+1]==0){ // 右边可以放置
Chess[i][j]=Chess[i][j+1]=1; // 放置
Domino(i,j+1); // 右移
Chess[i][j]=Chess[i][j+1]=0; // 恢复
}
}
else Domino(i,j+1); // 右移
}
}
int main(){
cin >> m >> n;
bool *p=new bool[m*n];
for(int i=0;i<m*n;i++)p[i]=0;
Chess=new bool*[m];
for(int i=0;i<m;i++)Chess[i]=p+i*n;
Domino(0,0);
cout << Count << endl;
delete []Chess;
delete []p;
return 0;
}