蓝桥杯题——方格填数

  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

posted @ 2019-03-14 19:59  池塘之底  阅读(241)  评论(0编辑  收藏  举报