用c++ 求智能手机的滑动解锁方式一共多少种?3*3格

下面是我写的C++,思想是枚举方向,如果下一个方向被标记,则按原来方向再搜下一个点,否则跳到下一个点并标记
按说 枚举每个点为起点的时候 1,3,7,9跑出来的ans是相同的;
2,4,6,8跑出来的ans也是相同的,为什么 我这代码跑出来2,4,6,8,不是相同的,并且最后加起来的答案应该是30多万,我的答案相差很大,求大神解!!!

 #include <iostream>
#include <string.h>
using namespace std;
const int maxn=1e5+10;
int vis[10],vis1[10],in[10],out[10],head[200],q,ans,a[5][5];
int dir[12][2]={1,0,0,1,-1,0,0,-1,-1,-1,-1,1,1,1,1,-1,-2,-1,2,1,-2,1,2,-1};
struct point {
    int to,next;
}pt[200];
struct pp{
    int x;
    int y;
}sto[10];
void add(int u,int v)
{
    pt[q].next=head[u];
    pt[q].to=v;
    head[u]=q++;
}
void dfs(int po,int x,int y,int len)
{
    //cout<<po<<"~~~~~~~~"<<endl;
    if (len>=4)
        ans++;
    int flag=0;
    /*for (int i=head[po];i!=-1;i=pt[i].next)
    {
        cout<<"%%%%%"<<endl;
        int to=pt[i].to;
        if (!vis[to])
        {
            flag++;
            vis[to]=1;
            dfs(to,sto[to].x,sto[to].y,len+1);
            vis[to]=0;
        }
    }*/
    if (!flag)
    {
        for (int i=0;i<12;i++) //枚举12个方向
        {
            int xx=x+dir[i][0];
            int yy=y+dir[i][1];
            if (xx>=1&&xx<=3&&yy>=1&&yy<=3&&!vis[a[xx][yy]]) //下一步如果没被标记;
            {
                vis[a[xx][yy]]=1;
                dfs(a[xx][yy],xx,yy,len+1);
                vis[a[xx][yy]]=0;
            }
            else if (xx>=1&&xx<=3&&yy>=1&&yy<=3&&i<=7)// 下一步被标记,按照方向再走一步,看是否被标记
            {
                int xxx=xx+dir[i][0];
                int yyy=yy+dir[i][1];
                if (xxx>=1&&xxx<=3&&yyy>=1&&yyy<=3&&!vis[a[xxx][yyy]])
                {
                    vis[a[xxx][yyy]]=1;
                    dfs(a[xxx][yyy],xxx,yyy,len+1);
                    vis[a[xxx][yyy]]=0;
                }
            }
        }
    }
}
int main()
{
    int t,len,s=1,n,u,v;
    for (int i=1;i<=3;i++)
        for (int j=1;j<=3;j++)
            a[i][j]=s++;
    cin>>t;
    for (int i=1;i<=t;i++)
    {
        int  k=1;
        ans=0;
        cin>>n;
        memset(vis,0,sizeof(vis));
        memset(head,-1,sizeof(head));
        q=0;
        for (int i=1;i<=n;i++)
        {
            cin>>u>>v;
            add(u,v);
            add(v,u);
        }
        for (int i=1;i<=3;i++) //枚举每个点当起点
            for (int j=1;j<=3;j++)
            {
                ans=0;
                len=1;
                //sto[k].x=i;
                //sto[k].y=j;
                vis[k]=1;
                dfs(k++,i,j,len);
                cout<<ans<<"######"<<endl;
                vis[k-1]=0;
                for (int s=1;s<=9;s++)
                    cout<<vis[s]<<" ";
                cout<<endl;
             }
        //cout<<ans<<endl;
    }
    return 0;
}

389112种
具体看这个[手机9宫格图案解锁方法总数计算

你的枚举貌似思路都错了
首先,没必要
// 下一步被标记,按照方向再走一步,看是否被标记???
dfs也没有返回;
我觉得不用想那么复杂
bool 用二维
一个一个点枚举,判断边界,简单的深搜就行了,效率也是这样;

个人意见,可能跟你不大一样,仅供参考