T T T
T T T T
T T T
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
我的思路是
1:先把这10个数进行排列,然后把排列后的数字存入一个二维数组b[3][4]中;
2:用int c[8][2] = {1,1,1,-1,-1,-1,-1,1,0,1,1,0,-1,0,0,-1};来判断是否满足题目条件
3,把满足的输出来。
#include <iostream> #include <string> #include <math.h> using namespace std; int a[10] = {0,1,2,3,4,5,6,7,8,9}; int sum = 0; int b[3][4]; void F()//输出每一种情况 { for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { cout<<b[i][j]<<" "; } cout<<endl; } cout<<endl; cout<<endl; } void Add() { int c[8][2] = {1,1,1,-1,-1,-1,-1,1,0,1,1,0,-1,0,0,-1};//上下左右加四个斜角,共八个方向 int x; int y; int nn = 1; for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { for(int k=0;k<8;k++) { x = i+c[k][0]; y = j+c[k][1]; if(x<0||x>=3||y<0||y>=4) { continue; } if(abs(b[i][j] - b[x][y])==1 ) { nn = 0; break; } } if(nn == 0) { break; } } if(nn == 0) { break; } } if(nn == 1) { sum++; // F();//输出每一种情况 } } void fun(int m,int n)//组合,保存到数组中 { if(m == 0) { b[0][1] = a[0]; b[0][2] = a[1]; b[0][3] = a[2]; b[1][0] = a[3]; b[1][1] = a[4]; b[1][2] = a[5]; b[1][3] = a[6]; b[2][0] = a[7]; b[2][1] = a[8]; b[2][2] = a[9]; Add(); } else { int t; for(int i=0;i<=m;i++) { t = a[i]; a[i] = a[m]; a[m] = t; fun(m-1,n); t = a[i]; a[i] = a[m]; a[m] = t; } } } int main() { memset(b,0,sizeof(b)); b[0][0] = 20; b[2][3] = 20; fun(9,10); cout<<sum<<endl; return 0; }
原文:https://www.cnblogs.com/zkw123/p/10533058.html