方格填数

题目:

如下的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;
}

 

posted @ 2018-11-24 19:17  执||念  阅读(1030)  评论(0编辑  收藏  举报