OJBFOWE 2018-03-17 02:56 采纳率: 0%
浏览 724
已结题

用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;
}

  • 写回答

3条回答 默认 最新

  • Fly_阳 2018-03-17 03:07
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 一道python难题
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度