| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3496 人关注过本帖
标题:【趣味游戏】大家来比比算法
只看楼主 加入收藏
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
加入你的行列

想象力征服世界
2009-11-12 19:39
fuqingjun
Rank: 2
来 自:山东
等 级:论坛游民
帖 子:48
专家分:80
注 册:2009-11-2
收藏
得分:2 
几乎就是遍历,你不遍历又怎么能找全呢?把那个二维的字符表  拆解成 n个字符串,然后 用单词往字符串上匹配,成功则yes 不成功则no

    w  h  a  t
      h  o  w  e
      i  n  t  a
      e  y  r  h
反序的情况不过就是 反向字符串
上述二维字符表可拆解为    横向的 what    tahw   howe  ewoh   inta  atni  eyrh   hrye                        
                        纵向的 whie    eihw   hony  ynoh   awtr  rtwa  teah   haet
                        斜向的 woth    htow   twne  enwt   (如果是只需要对角线的斜向)
那么就用某个单词和这些字符串都去匹配一次。 当然匹配过程是有好的算法的。在学习c语言的时候应该学过的 字符匹配算法。

我是猪猪,我很想进步,寻志同道合者革命途中并肩行路!
2009-11-12 23:57
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:2 
程序代码:
#include <stdio.h>
#include <string.h>

#define N 100
#define M 10000

char a[N + 2][N + 2];
int vdir[][2] =
{
    {0, -1}, {1, -1}, {1, 0}, {1, 1},
    {0, 1}, {-1, 1}, {-1, 0}, {-1, -1},
};
char words[M][2*N];
int next[M][2*N];
int x, y, m;

void get_next(int *next, char *s)
{
    int i = 0, j = 1;

    next[0] = -1;
    while (s[j] != '\0')
    {
        if (s[i] == s[j])
            next[j] = next[i];
        else
        {
            next[j] = i;
            while (next[i] != -1 && s[next[i]] != s[j])
                i = next[i];
        }
        ++i, ++j;
    }
}

int kmp_search(int i, int j, int k, char *s, int *next)
{
    int si = 0;
    while (a[i][j] != '\0')
    {
        if (si == -1 || a[i][j] == s[si])
        {
            i += vdir[k][1], j += vdir[k][0];
            ++si;
            if (s[si] == '\0')
                break;
        }
        else
            si = next[si];
    }
    return s[si] == '\0';
}

void solve(void)
{
    int a = y, b = 1, i = 0, j, k;

    while (i < 4)
    {
        for (j = 0; j < m; ++j)
        {
            if (words[j][0] != '\0')
            {
                for (k = 0; k < 8; ++k)
                    if (kmp_search(a, b, k, words[j], next[j]))
                    {
                        puts(words[j]);
                        words[j][0] = '\0';
                        break;
                    }
            }
        }

        a += vdir[i<<1][1], b += vdir[i<<1][0];
        if (a <= 0 || a > y || b <= 0 || b > x)
        {
            a -= vdir[i<<1][1], b -= vdir[i<<1][0];
            ++i;
            a += vdir[i<<1][1], b += vdir[i<<1][0];
        }
    }
}

int main(void)
{
    while (scanf("%d%d", &x, &y) == 2)
    {
        int i, j;

        for (i = 0; i < y + 1; ++i)
            a[i][0] = a[i][x+1] = 0;
        for (j = 0; j < x + 1; ++j)
            a[0][j] = a[y+1][j] = 0;
        for (i = 1; i <= y; ++i)
            for (j = 1; j <= x; ++j)
                scanf(" %c", &a[i][j]);
        scanf("%d", &m);
        for (i = 0; i < m; ++i)
        {
            scanf("%s", words[i]);
            get_next(next[i], words[i]);
        }
        solve();
    }
    return 0;
}
/* - cc: run+='<in' */

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-13 14:31
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
晕··误解了题的意思···我以为方向是可以转角的··即可沿折线··汗··

———————深度研究楼上代码——————————

2009-11-13 15:50
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
此题在刘汝佳翻译的《挑战编程》中出现过,不过是个特殊的KMP而已……

专心编程………
飞燕算法初级群:3996098
我的Blog
2009-11-13 16:16
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
暂不发言
下线看

想象力征服世界
2009-11-13 18:17
快速回复:【趣味游戏】大家来比比算法
数据加载中...
 
   



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

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