蓝桥杯省赛题:
把数字0~9填进去,使每个数字都不想连(对角也算相连),求共有多少种方法。
程序:
#include <iostream>
int n = 0;
void swap(int &a, int &b)
{
int m;
m = a;
a = b;
b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m) //基准
{
if(list[0]-list[1]!=1&&list[0]-list[1]!=-1)
if(list[0]-list[4]!=1&&list[0]-list[4]!=-1)
if(list[0]-list[5]!=1&&list[0]-list[5]!=-1)
if(list[0]-list[3]!=1&&list[0]-list[3]!=-1)
if(list[1]-list[2]!=1&&list[1]-list[2]!=-1)
if(list[1]-list[4]!=1&&list[1]-list[4]!=-1)
if(list[1]-list[5]!=1&&list[1]-list[5]!=-1)
if(list[1]-list[6]!=1&&list[1]-list[6]!=-1)
if(list[2]-list[5]!=1&&list[2]-list[5]!=-1)
if(list[2]-list[6]!=1&&list[2]-list[6]!=-1)
if(list[3]-list[7]!=1&&list[3]-list[7]!=-1)
if(list[3]-list[4]!=1&&list[3]-list[4]!=-1)
if(list[3]-list[8]!=1&&list[3]-list[8]!=-1)
if(list[4]-list[7]!=1&&list[4]-list[7]!=-1)
if(list[4]-list[8]!=1&&list[4]-list[8]!=-1)
if(list[4]-list[9]!=1&&list[4]-list[9]!=-1)
if(list[4]-list[5]!=1&&list[4]-list[5]!=-1)
if(list[5]-list[8]!=1&&list[5]-list[8]!=-1)
if(list[5]-list[9]!=1&&list[5]-list[9]!=-1)
if(list[5]-list[6]!=1&&list[5]-list[6]!=-1)
if(list[6]-list[9]!=1&&list[6]-list[9]!=-1)
if(list[7]-list[8]!=1&&list[7]-list[8]!=-1)
if(list[8]-list[9]!=1&&list[8]-list[9]!=-1)
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(list[k], list[i]); //交换
perm(list, k + 1, m);
swap(list[k], list[i]); //在交换回来
}
}
}
int main()
{
int list[] = {0,1, 2, 3,4,5,6,7,8,9};
perm(list, 0, 9);
std::cout<<"total:" <<n<<"\n";
return 0;
}
结果:1580