标题:方格填数
在2行5列的格子中填入1到10的数字。
要求:
相邻的格子中的数,右边的大于左边的,下边的大于上边的。
如【图1.png】所示的2种,就是合格的填法。
请你计算一共有多少种可能的方案。
请提交该整数,不要填写任何多余的内容(例如:说明性文字)。
42
思路:利用一维数组,得到全排列,放置在2*5方格内,判断符合要求,计数加1
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int count =0;
bool is_ok(int arr[])
{
//右边的大于左边的
for(int i = 1; i < 5; i++)
{
if((arr[i] <= arr[i-1]) || (arr[i+5] <= arr[i+4]))
return 0;
}
//下边的大于上边的
for(int i = 0; i < 5; i++)
{
if(arr[i+5] <= arr[i])
return 0;
}
return 1;
}
void permutation(int arr[],int begin,int end)
{
if(begin == end)
{//得到了一个全排列
//判断是否符合要求
if(is_ok(arr))
count++;
}
else
{
for(int i = begin; i <= end; i++)
{
swap(arr[i],arr[begin]);
permutation(arr,begin+1,end);
swap(arr[i],arr[begin]);
}
}
}
int main(int argc, char** argv) {
permutation(arr,0,9);
cout<<count<<endl;
return 0;
}