华师一附中OI组
标题:
用1*2的骨牌去覆盖n*n的棋盘
[打印本页]
作者:
admin
时间:
2014-10-23 10:47
标题:
用1*2的骨牌去覆盖n*n的棋盘
其中n为偶数,求有多少种覆盖的方法。
<p>#include <iostream>
#include <iomanip>
using namespace std;
const int n=4; 假设是4*4 的格子
int a[n*n];
int s=1;
void mysearch(int i)
{
int j;
if (i==n*n)
{
for (j=0; j<=n*n-1; j++)
{
cout<<setw(3)<<a[j];
if (j%n==n-1) cout<<endl;
}
cout<<endl;
}
else if (a[i]>0) mysearch(i+1);
else
{
if (a[i+1]==0)
{
a[i]=a[i+1]=s++;
mysearch(i+1);
s--;
a[i]=a[i+1]=0;
}
if (a[i+n]==0)
{
a[i]=a[i+n]=s++;
mysearch(i+1);
s--;
a[i]=a[i+n]=0;
}
}
}
int main()
{
mysearch(0);
return 0;
}
复制代码
作者:
hr567
时间:
2014-10-23 21:08
老师好像用递归做过,但是不及得了
作者:
admin
时间:
2014-10-25 17:41
此题可以用一维数组或者二维数组做,区别不大,我的程序比较好记,可以参考。
也可以将记录骨牌序号的S作为参数带到mysearch函数里面去,见下
#include <iostream>
#include <iomanip>
using namespace std;
const int n=4;
int a[n*n];
int t=1;
void mysearch(int i,int s)
{
if (i==n*n)
{
cout<<t++<<":"<<endl;
for (int j=0; j<=n*n-1; j++)
{
cout<<setw(3)<<a[j];
if (j%n==n-1) cout<<endl;
}
cout<<endl;
}
else if (a[i]>0) mysearch(i+1,s);
else
{
if ((i%n<=n-2) &&(a[i+1]==0)) //横着摆
{
a[i]=a[i+1]=s;
mysearch(i+2,s+1); //a[i]和a[i+1]都放了骨牌,直接搜索i+2;
a[i]=a[i+1]=0;
}
if ((i/n<=n-2)&&(a[i+n]==0)) //竖着摆
{
a[i]=a[i+n]=s;
mysearch(i+1,s+1);
a[i]=a[i+n]=0;
}
}
}
int main()
{
mysearch(0,1);
return 0;
}
复制代码
作者:
/wjr/
时间:
2014-10-28 18:43
#include<iostream>
#include<cstdlib>
using namespace std;
int a[1000][1000],n,tot,x0,y0;
void print()
{
tot++;
for(int x=1;x<=n;x++)
{
for(int y=1;y<=n;y++)cout<<a[x][y]<<" ";
cout<<endl;
}
cout<<endl;
}
void mysearch(int i)
{
int x,y;
for(x=x0;x<=n;x++)
for(y=y0;y<=n;y++)
{
if(!a[x][y]&&!a[x+1][y])
{
a[x+1][y]=a[x][y]=i;
x0=x;y0=y;
mysearch(i+1);
a[x+1][y]=a[x][y]=0;
x0=0;y0=0;
}
if(!a[x][y]&&!a[x][y+1])
{
a[x][y]=a[x][y+1]=i;
x0=x;y0=y;
mysearch(i+1);
a[x][y]=a[x][y+1]=0;
x0=0;y0=0;
}
}
if(i==n*n/2)print();
}
int main()
{
cin>>n;
//if(n%2){cout<<"None!!";return 0;}
for(int i=0;i<=n+1;i++)
a[0][i]=a[n+1][i]=a[i][n+1]=a[i][0]=-1;
mysearch(1);
cout<<tot;
system("pause");return 0;
}
复制代码
这是我的,求改进。。
作者:
admin
时间:
2018-8-24 11:22
还有一个做法,就是状压DP
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2