这道题用dfs做,建一个3x4的矩阵,注意一下搜索的顺序

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std; int a[3][4] = {
   -20};// 必须要初始化!!!!
int vis[10];
int ans; int check(int x,int y,int v){
   
    int dir[4][2] = {
   {
   0,-1},{
   -1,-1},{
   -1,0},{
   -1,1}};//只需要判断之前填过的位置就可以了
    for(int i = 0; i < 4; i++){
   
        int xx = x + dir[i][0];
        int yy = y + dir[i][1]; if(xx >= 0 && xx < 3 && yy >= 0 && yy < 4){
   
            if(abs(v-a[xx][yy]) == 1) return 0;
        }
    }
    return 1;
}
void dfs(int x,int y){
   
    if(x == 2 && y == 3){
   
        ans++;
        return ;
    }
    for(int i = 0; i <= 9; i++){
   
        if(!vis[i] && check(x,y,i)){
   
            vis[i] = 1;
            a[x][y] = i;
            if(y+1 < 4)
                dfs(x,y+1);
            else
                dfs(x+1,0);
            vis[i] = 0;
        }
    }
}
int main(){
   
    memset(vis,0,sizeof(vis));
    ans = 0;
    dfs(0,1);
    cout << ans << endl;
    return 0;
}