九宫格程序代码 共享并希望大家多提意见

九宫格程序代码 共享并希望大家多提意见

以下是该程序的题目要求,如下:编程题:Android手机9宫格有多少种可能的手势?如果是16宫格呢? 规则:4个点或以上的手势才算;一个手势中,每个点最多只能被算作经过一次;只有已经经过的点才能直接越过,也就是说,如果你想连接的两个点中间还有其他点,那这些点必须是已经被之前经过的。

解题思路:1、本题从数学角度也可以解出来,但是比较复杂。若程序实现,可以从遍历树结构或者动态规划的角度实现,但是在保存现场中可以用到栈或者队列。2、本人从三个模块入手,第一个模块是初始化模块,用于初始化初始的连接矩阵,构造一个可连接矩阵,1表示可连接,0表示不可连接。第二个模块用于计算新的连接矩阵,根据之前遍历过得节点修改连接矩阵。第三个模块用于递归遍历树。

程序代码如下:

代码块

include “stdio.h”

define FALSE 0

define TRUE 1

//commonset
int mode;//0 equal to 9GongGe,1 equal to 16Gongge
int level = 0;
int layer = 4;
long int count=0;
int stat[9]={FALSE};
int C_List[9]={0};
int StarterDirection[9][9]=
    {
   //1,2,3,4,5,6,7,8,9 node
    {0,1,0,1,1,1,0,1,0},
    {1,0,1,1,1,1,1,0,1},
    {0,1,0,1,1,1,0,1,0},
    {1,1,1,0,1,0,1,1,1},
    {1,1,1,1,0,1,1,1,1},
    {1,1,1,0,1,0,1,1,1},
    {0,1,0,1,1,1,0,1,0},
    {1,0,1,1,1,1,1,0,1},
    {0,1,0,1,1,1,0,1,0},
    };
int direction[9][9]=
    {
   //1,2,3,4,5,6,7,8,9 node
    {0,1,0,1,1,1,0,1,0},
    {1,0,1,1,1,1,1,0,1},
    {0,1,0,1,1,1,0,1,0},
    {1,1,1,0,1,0,1,1,1},
    {1,1,1,1,0,1,1,1,1},
    {1,1,1,0,1,0,1,1,1},
    {0,1,0,1,1,1,0,1,0},
    {1,0,1,1,1,1,1,0,1},
    {0,1,0,1,1,1,0,1,0},
    };


//
int CaculateRouter(int stat[9])
{
    //caculate the node direction
    int i,j;
    for(i=0;i<9;i++)
    {
        for(j=0;j<9&&direction[i][j]==0;j++)
        {
            if((i+j)/2.0-int((i+j)/2.0) == 0.0 && stat[(i+j)/2]==TRUE&&i!=j)//
                direction[i][j]=1;
        }
    }
    for(i=0;i<9;i++)
    {
        if(stat[i]==TRUE)//fix the matrix of CanGet,cut the havelinked node
            for(j=0;j<9;j++)
                direction[j][i]=0;
    }

    return 1;
}
int Build(int node,int level)//level start from 0
{
    if(level== layer-1)
    {   
        count++;
        //printf("Find One!----%ld\n",count);
        return 1;
    }
        for(int k=0;k<9;k++)
        {   
            if(direction[node][k]==1)
            {
                int i,j;
                //临时存储现场
                int temp1[9][9];
                int stat1[9];
                for(i=0;i<9;i++)
                    stat1[i]=stat[i];
                for(i=0;i<9;i++)
                    for(j=0;j<9;j++)
                        temp1[i][j]=direction[i][j];    
                stat[node]=TRUE;
                level ++;
                //以上为保存现场

                CaculateRouter(stat);
                Build(k,level);


                //恢复现场
                stat[node]=FALSE;
                level--;
                node++;
                for(i=0;i<9;i++)
                    for(j=0;j<9;j++)
                        direction[i][j]=temp1[i][j];
                for(i=0;i<9;i++)
                    stat[i]=stat1[i];
            }
        }

}
        /*
    if (level == layer)
    {   
        count++;
        level--;
        printf("\n Find One!!!\n");
        int i,j;
        for(i=0;i<9;i++)
            for(j=0;j<9;j++)
                directionPoint[i][j]=direction[i][j];
        return 1;
    }

    while(node<9)
    {   
        if(stat[node]==TRUE)
            return 0;
        int j=0;
        stat[node]=TRUE;
        printf("%d-->",node);
        while(j<9 )
        {
            if(directionPoint[node][j] == 1)
            {   
                CaculateRouter(stat,directionPoint);
                level++;
                DFS9GongGe(stat,j,level,directionPoint);
            }
            j++;
        }
        stat[node]=FALSE;
        node++;
        return 1;
    }
    return 1;
    */



int main()
{
    int Pointdirection[9][9]=
    {
   //1,2,3,4,5,6,7,8,9 node
    {0,1,0,1,1,1,0,1,0},
    {1,0,1,1,1,1,1,0,1},
    {0,1,0,1,1,1,0,1,0},
    {1,1,1,0,1,0,1,1,1},
    {1,1,1,1,0,1,1,1,1},
    {1,1,1,0,1,0,1,1,1},
    {0,1,0,1,1,1,0,1,0},
    {1,0,1,1,1,1,1,0,1},
    {0,1,0,1,1,1,0,1,0},
    };

    int num=4;
    while(num<=9)
    {
        layer =num;
        num++;
        Build(0,0);
    }
    printf("Total = %ld",count);
}

脚注

对代码几点解释:
1、代码有部分冗余,但是完全可以运行
2、矩阵为连接矩阵,每次递归需要修改
3、通过全局变量实现对程序的控制。
4、程序结果可以妙出,但是对于16个点的四乘四矩阵运算时间较长,下次发文会对4X4矩阵的算法。
5、通过该程序对递归程序的有了一定了解,在编译器阶段,将程序不是debug版本,直接出exe可执行文件。利用IDA反编译程序,发现程序在编译阶段进行了一定的优化。下一步准备改造程序,利用栈和队列构造生成树,不采用递归算法。

程序生成结果

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值