zoukankan      html  css  js  c++  java
  • 方格填数

    题目:

    如下的10个格子:

    答案:1580

    你有0~9十个数,每个数只能用一次,且连续的数不能放在相邻的格子里(上下,左右对角都算相邻)

    思路:模拟每个位置能放的数,DFS;递归深度为格子的个数,每个格子有10种选择:0~9,从左上角格子出发,递归出口为到达右下角:

    代码:

    #include<iostream>
    #include<math.h>
    #include<cmath>
    #include<string.h>
    using namespace std;
    const int maxn=5;
    const int inf=99999999;
    bool vis[15];
    int a[maxn][maxn];
    int ans=0;
    bool judge(int x,int y,int m)
    {
        for(int i=-1;i<=0;i++)
        {
            for(int j=-1;j<=1;j++)
            {
                int xx=x+i;
                int yy=y+j;
                if(xx<0||yy<0||xx>2||yy>3) continue;
                if(abs(a[xx][yy]-m)==1) return false;
            }
        }
        return true;
    }
    void dfs(int x,int y)
    {
        //cout<<"x:"<<x<<" "<<"y:"<<y<<endl;
        if(x==2&&y==3)
        {
            ans++;
            return ;
        }
        if(x<0||y<0||x>2||y>3) return ;
        for(int i=0;i<10;i++)
        {
            if(!vis[i]&&judge(x,y,i))
            {
                vis[i]=true;
                a[x][y]=i;
                //cout<<"a[x][y]:"<<a[x][y]<<endl;
                if(y!=3)dfs(x,y+1);
                else dfs(x+1,0);
                vis[i]=false;//回溯
                a[x][y]=inf;//回溯
            }
        }
    }
    int main()
    {
        memset(vis,false,sizeof(vis));
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<4;j++)
                a[i][j]=inf;
        }
        dfs(0,1);
        cout<<ans<<endl;
    }
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    串的模式匹配
    Linux_ch02
    Linux操作简介
    Stack&Queue
    单链表
    工作中用到的oracle字符串分割整理
    maven_spring mvc_mina_dome(实体,文件,批传)(spring mina 初学dome)
    求整数和与均值
    简单计算器
    苹果和虫子2
  • 原文地址:https://www.cnblogs.com/caijiaming/p/10013103.html
Copyright © 2011-2022 走看看