1284: [蓝桥杯2016初赛]方格填数
时间限制: 1 Sec 内存限制: 256 MB
提交: 355 解决: 202
[状态] [提交] [命题人:外部导入]
题目描述
如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
http://oj.ecustacm.cn/problem.php?id=1264
这道题和[蓝桥杯2016初赛]方格填数很像,思路是全排列+判断
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int ans;
bool ok(vector< vector<int> >& v){
for(int i=0;i<2;i++){//右边的大于左边的
for(int j=1;j<5;j++){
if(v[i][j]<v[i][j-1])return false;
}
}
for(int j=0;j<5;j++){
if(v[1][j]<v[0][j])return false;
}
return true;
}
void f(int a[]){
vector< vector<int> > v(2,vector<int>(5));
for(int i=0;i<2;i++){
for(int j=0;j<5;j++){
v[i][j]=a[i*5+j];
}
}
if(ok(v))
ans++;
}
int main(){
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
do{
f(arr);
}while(next_permutation(arr,arr+10));
cout<<ans<<endl;
return 0;
}