| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 395 人关注过本帖, 2 人收藏
标题:求做此类题目的思路
只看楼主 加入收藏
huwengui
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:166
专家分:158
注 册:2011-4-22
结帖率:83.33%
收藏(2)
已结贴  问题点数:20 回复次数:6 
求做此类题目的思路
两个1,两个2,两个3,这6个数可组成6位数312132。这个数有如下特点:两个1之间隔一位,两个2之间隔两位,两个3之间隔3位。231213也是一个符合条件的6位数。用数字1、2、3、4、5、6、7、8各两个,可以组成类似的16位数,请找出10个这样的16位数。

谁能简要的说一下思路啊???
2011-07-11 21:06
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:7 
#include <stdio.h>
#define N 14

void pai(int a[],int i,int n);
int judge(int a[],int n);

int main(void)
{
    int a[N]={1,1,2,2,3,3,4,4,5,5,6,6,7,7};
    int n=N;
    pai(a,0,n-1);
    return 0;
}

void pai(int a[],int i,int n)
{
    int j,c,k;
    if(i==n)
    {
    /*    for(j=0;j<=n;j++)
            printf("%d",a[j]);
        printf("\n");   */


        k=0;
        k=judge(a,n);
        if(k==1)
        {
            for(j=0;j<=n;j++)
                printf("%d",a[j]);
            printf("\n");
        }
    }
    else
    {
        for(j=i+1;j<=n;j++)
        {
            c=a[i];
            a[i]=a[j];
            a[j]=c;
            pai(a,i+1,n);
            c=a[i];
            a[i]=a[j];
            a[j]=c;
        }
    }
}

int judge(int a[],int n)
{
    int i,j;
    for(i=0;i<=n;i++)
    {
        j=a[i];
        if(i+j+1<=n||i-j-1>=0)
        {
            if(a[i+j+1]==j||a[i-j-1]==j)
                continue;
            else
                return -1;
        }
        else
            return -1;
    }
    return 1;
}


用递归先求出数组的全排列,对排练进行判断,满足条件的就打印出来
上面是{1,1,2,2,3,3,4,4,5,5,6,6,7,7}数组的,满足的数有(比如)
14156742352637
17126425374635
26327435614175
……
没有用1~8的数是因为实在太复杂了
运算时间很长,理论上能算,但我的算法还是烂,1~7以下的好求
2011-07-12 02:41
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:7 
程序代码:
#include <stdio.h>
void Test(int n, int length, int mask, int *count)
{
    static int s[32];
    int i, a;
    
    if(n <= 0)
    {
        for(i = 0; i < length; i++)
            printf("%d", s[i]);
        printf("\n");
        (*count)++;
        return;
    }
    a = 1 << (n + 1);
    a |= 1;
    for(i = 0; i < length - n - 1; i++,(a <<= 1))
    {
        if(mask & a) continue;
        mask |= a;
        s[i] = n;
        s[i + n + 1] = n;
        Test(n - 1, length, mask, count);
        mask &= ~a;
    }
}

int Work(int n)
{
    int c = 0;
    Test(n, n * 2, 0, &c);
    printf("count = %d\n", c);
}

int main()
{
    int n = 8;
    Work(n);
    return 0;
}


n = 8 的情况下结果有300组,改变n值可以试试别的值,这段代码n限制在15以内。
8372632458764151 8273264358746151 8271216458734653 8271215648735463 8457264258376131 8247263458376151 8527326538471614 8357236258471614 8427524638573161
8237243568471516 8642752468357131 8631713568427524 8426724358637151 8121726358437654 8451714658237263 8352732658417164 8131743568427526 8121724568347536
8642572468531713 8613175368425724 8456274258631713 8416174358632752 8141673458362752 8131573468524726 8246257438653171 8121627538463574 8514167548236273
8253267358416174 8236253748651417 8316135748625427 8121625748365437 8131563748526427 7823625374865141 7831613574862542 7812162574836543 7813156374852642
6827325634875141 3847362452876151 3857316154872642 3847326425871615 5827425634873161 5817135643872462 4857141653872362 6831713645827425 4862742356837151
2852716154837643 2852734653847161 4835743625827161 5841715463827326 5823725364817146 6852472654831713 5864275246831713 2862171456834753 5814175642832763
1815374635842762 2812174635843765 1813475364825726 2812175364835746 6814157643852372 2862357436854171 4853647352862171 2852637453864171 1814637543862572
2852467354836171 3845367425826171 1815267245836473 2842367435816175 2812167345836475 3825327465814176 2812157463854376 3862352746851417 3861315746825427
5824625743861317 4852642753861317 5814165743826327 3852362754816147 2832463754816157 2812164753846357 4815146735823627 2812156734853647 7386235274685141
7386131574682542 7582462574386131 7485264275386131 7581416574382632 7385236275481614 7283246375481615 7281216475384635 7481514673582362 7281215673485364
5784265247386131 4782542637583161 2782345637485161 3782342567481516 6485724625387131 2382736151487654 5181725623487364 4181742562387536 6181473654382752
6284273645381715 2682171465384735 3586371514682742 3486374151682752 5181375632482764 3485374615182762 2482374635181765 5283275364181746 2582473564381716
3582372564181746 3485374265281716 3181375264285746 6285247635483171 6384537642582171 6181537643582472 4683547362582171 2682537463584171 3681317562482574
3681317465284275 4586347532682171 3181367245286475 2382437564181576 3181347562482576 4682542763581317 3681315764285247 5286235743681417 5181365734286247
2382436754181657 3181346752482657 7468254276358131 7368131576428524 7528623574368141 7518136573428624 7238243675418165 7318134675248265 5748625427368131
4738643257268151 3758316157428624 4718146257238653 1718246257438653 5728325637418164 4758141657238263 4738543627528161 4718143567328526 6278234653748151
6378131645728425 4278246151738653 5378435624728161 3478324625718165 5378235264718146 4578141563728326 6238273651418754 6418174625328735 5618175264238743
1618274265348735 3568371516428724 5248275461318736 1518473564328726 6258237653418174 1618257263458374 3628327561418574 4618147365238275 3568347526428171
3568327526418174 4268247516138573 1518627523468374 1318637245268475 5628425764318137 5618145763428327 4268243756318157 1418634753268257 4258246751318637
1318536724528647 7562842576431813 7561814576342832 7426824375631815 7141863475326825 7425824675131863 7131853672452864 6752842657431813 6751814657342832
5746825427631813 1712862357436854 5724825647131863 4752842657131863 1714853647352862 1712852637453864 2742853467351816 1712852467354836 1713845367425826
6475824625731813 6171825624735843 6471814652732853 6171834653742852 6471814635723825 5671815364732842 2672815164735843 4672842365731815 2572861514736843
2472864151736853 5374835641712862 5171835463724826 2572834563741816 6357832652471814 4637843265271815 4567841516372832 1317835264275846 6151847652432873
1615847365432872 1613857362452874 1316837425624875 4635843765121827 2632853764151847 5364835746121827 5161845736423827 4161845726325837 2362834756141857
1316835724625847 1316834752642857 2452864751316837 1415864725326837 7463584376512182 7263285376415184 7536483574612182 7516184573642382 7416184572632583
7236283475614185 7131683572462584 7131683475264285 7245286475131683 7141586472532683 6734583647512182 6714185647235283 5746385437612182 5716185347632482
3746385427625181 1716285247635483 1716384537642582 2752683457364181 1714683547362582 1712682537463584 1714586347532682 2732583467514186 6475384635712182
6275284635743181 5673485364712182 2672485364735181 3672382465714185 3574386541712682 3171386425724685 3171384562742586 6417184635273285 6237283645171485
1617285263475384 1617483564372582 3467384516172582 1517386532472684 5247285463171386 2632783561417584 2642783465317185 1613784365247285 5161785246237483
2462784516137583 1516782542637483 1415784365237286 2462584736513187 3456384752612187 2452684753161387 1415684735263287 7246258473651318 7345638475261218
7245268475316138 7141568473526328 4716148537623528 3726328457614158 4753648357261218 1713568347526428 6274258643751318 2572638543761418 2572368534716148
3171368524726548 4275248635713168 3171358642752468 6357438654271218 6257248653471318 4617148562372538 3627328564171548 4567348536271218 1517368534276248
4257248653171368 1317538642572468 6151748653427328 1613758364257248 4161748526327538 4161748356237258 1516738543627428 1316738524627548 3645378465121728
3564378546121728 1516478534623728 1514678542362738
count = 300
太长了,对结果重排一下版

[ 本帖最后由 beyondyf 于 2011-7-15 22:59 编辑 ]

重剑无锋,大巧不工
2011-07-12 22:26
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:7 
回复 3楼 beyondyf
算法仍然强大。。。

My life is brilliant
2011-07-12 22:34
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 4楼 lz1091914999
谢了。本质还是遍历解空间。通过建模控制解空间,尽量减少无效空间。遍历中注意剪枝,减少无谓的计算。上面的代码得到n=8的结果大概需要1秒的时间,不太满意。各位有没有什么别的算法?也拓展一下我的思路。

重剑无锋,大巧不工
2011-07-13 17:15
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 5楼 beyondyf
我遇到这种问题都很难建立解空间,不知您是如何做到的,难道是ACM练出来的???

My life is brilliant
2011-07-13 17:58
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 6楼 lz1091914999
无他, 但手熟尔

重剑无锋,大巧不工
2011-07-14 09:51
快速回复:求做此类题目的思路
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026326 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved