蓝桥杯题——方格填数
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; }
public class Main { static int art[][] = new int[3][4]; static boolean vis[] = new boolean [10]; static int c[][]= {{1,1},{1,-1},{-1,-1},{-1,1},{0,1},{1,0},{-1,0},{0,-1}};//上下左右加四个斜角,共八个方向 static int count = 0;//保存所有情况 public static void print() { for(int i=1;i<11;i++) { System.out.print(art[i/4][i%4]); } System.out.println(); } public static boolean yuejie(int x,int y) { if(x<0||y<0||x>=3||y>=4) return false; return true; } public static boolean aizhe()//判断这种方法可不可行 { for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { for(int k=0;k<8;k++) { int dx = i+c[k][0]; int dy = j+c[k][1]; if(yuejie(dx, dy))//不越界 { int sum = art[i][j] - art[dx][dy]; if(Math.abs(sum) == 1)//挨着 { return false; } } } } } return true; } public static void fun(int n) { if(n == 11) { if(aizhe()) { print(); count++; } return; } if(n==0) { fun(n+1); } else { for(int i=0;i<=9;i++) { if(!vis[i])//所有情况 { vis[i] = true; int x = n/4; int y = n%4; art[x][y]=i; fun(n+1); vis[i] = false; } } } } public static void main(String[] args) { // TODO Auto-generated method stub art[0][0] = 100; art[2][3] = 100; fun(0); System.out.println(count); } }
答案:1580