搜索字符矩阵中的特定单词

时间:2012-05-18 06:46:21

标签: c search matrix

我试图通过 C 搜索字符矩阵中的特定单词,但无法找到固定的解决方案。

对于前: 假设我必须在字符矩阵中搜索 INTELLIGENT 这个词(3 * 9) (一旦从矩阵中选择一个字符形成一个句子,你就不能再选择它来形成同一个句子。从任何一个单元格到所有相邻单元格都有一条路径。邻居可以共享边缘或角落。)

IIIINN.LI  
....TTEGL  
.....NELI  

输出:YES(可以找到INTELLIGENT一词) 任何人都可以解决上述问题!!!!

4 个答案:

答案 0 :(得分:1)

使用深度优先搜索。

你可以使用递归algorthm来做到这一点。找到包含第一个字母的所有(未使用过的)位置,然后查看是否可以通过从相邻的一个方块开始在剩余的板上找到剩余的字。

答案 1 :(得分:0)

#include <stdio.h>

char Matrix[3][9] = {
    { 'I','I','I','I','N','N','.','L','I'},
    { '.','.','.','.','T','T','E','G','L'},
    { '.','.','.','.',',','N','E','L','I'}
};
char Choice[3][9] = { { 0 }, { 0 }, { 0 } };
const char WORD[] = "INTELLIGENT";
const int  Len = sizeof(WORD)-1;
int Path[sizeof(WORD)-1] = { 0 };

char get(int row, int col){
    if(1 > col || col > 9) return '\0';
    if(1 > row || row > 3) return '\0';
    if(Choice[row-1][col-1] || Matrix[row-1][col-1] == '.')
        return '\0';
    else
        return Matrix[row-1][col-1];
}

#define toLoc(r, c) (r)*10+(c)
#define getRow(L) L/10
#define getCol(L) L%10

int search(int loc, int level){
    int r,c,x,y;
    char ch;
    if(level == Len) return 1;//find it
    r = getRow(loc);
    c = getCol(loc);
    ch = get(r,c);
    if(ch == 0 || ch != WORD[level]) return 0;
    Path[level]=toLoc(r,c);
    Choice[r-1][c-1] = 'v';//marking
    for(x=-1;x<=1;++x){
        for(y=-1;y<=1;++y){
            if(search(toLoc(r+y,c+x), level + 1)) return 1;
        }
    }
    Choice[r-1][c-1] = '\0';//reset
    return 0;
}

int main(void){
    int r,c,i;
    for(r=1;r<=3;++r){
        for(c=1;c<=9;++c){
            if(search(toLoc(r,c), 0)){
                printf("YES\nPath:");
                for(i=0;i<Len;++i){
                    printf("(%d,%d)", getRow(Path[i]), getCol(Path[i]));
                }
                printf("\n");
                return 0;
            }
        }
    }
    printf("NO\n");
    return 0;
}

答案 2 :(得分:0)

我认为这就是你的意思.....虽然你现在提供的内容似乎更简单,但我可能误解了这个问题。

我使用Numpy将任意数组重塑为单个数组 字母列表,然后我们创建一个搜索词的掩码和 输入列表的副本。 我会在更新面具时勾选每个字母进行搜索。


import numpy as np
import copy

def findInArray(I,Word):
    M=[list(x) for x in I]

    M=list(np.ravel(M))

    print "Letters to start: %s"%"".join(M)

    Mask=[False]*len(Word)

    T = copy.copy(M)

    for n,v in enumerate(Word):
        try:
            p=T.index(v)
        except ValueError:
            pass
        else:
            T[p]=''
            Mask[n]=True

    print "Letters left over: %s"%"".join(T)            
    if all(Mask):print "Found %s"%Word
    else:print "%s not Found"%Word

    print "\n"

    return all(Mask)


I=["IIIINN.LI","....TTEGL",".....NELI"]

findInArray(I,"INTEL")
findInArray(I,"INTELLIGENT")
findInArray(I,"INTELLIGENCE")

示例输出

信件开始:IIIINN.LI .... TTEGL ..... NELI
遗留下来的信件:IIIN.I .... TGL ..... NELI
找到了INTEL

信件开始:IIIINN.LI .... TTEGL ..... NELI
遗留下来的信件:II.I ......... NLI
发现智能化

信件开始:IIIINN.LI .... TTEGL ..... NELI
留下的信件:II.I .... T ..... NLI
没有找到智能

答案 3 :(得分:0)

#include <stdio.h>

#define ROW 1
#define COL 11

char Matrix[ROW][COL] = { { 'I','N','T','E','L','L','I','G','E', 'N', 'T'} };
char Choice[ROW][COL] = { { 0 } };
const char WORD[] = "INTELLIGENT";
const int  Len = sizeof(WORD)-1;
int Path[sizeof(WORD)-1] = { 0 };

char get(int row, int col){
    if(1 > col || col > COL) return '\0';
    if(1 > row || row > ROW) return '\0';
    if(Choice[row-1][col-1] || Matrix[row-1][col-1] == '.')
        return '\0';
    else
        return Matrix[row-1][col-1];
}

#define toLoc(r, c) (r)*16+(c)
#define getRow(L) L/16
#define getCol(L) L%16

int search(int loc, int level){
    int r,c,x,y;
    char ch;
    if(level == Len) return 1;//find it
    r = getRow(loc);
    c = getCol(loc);
    ch = get(r,c);
    if(ch == 0 || ch != WORD[level]) return 0;
    Path[level]=toLoc(r,c);
    Choice[r-1][c-1] = 'v';//marking
    for(x=-1;x<=1;++x){
        for(y=-1;y<=1;++y){
            if(search(toLoc(r+y,c+x), level + 1)) return 1;
        }
    }
    Choice[r-1][c-1] = '\0';//reset
    return 0;
}

int main(void){
    int r,c,i;
    for(r=1;r<=ROW;++r){
        for(c=1;c<=COL;++c){
            if(search(toLoc(r,c), 0)){
                printf("YES\nPath:");
                for(i=0;i<Len;++i){
                    printf("(%d,%d)", getRow(Path[i]), getCol(Path[i]));
                }
                printf("\n");
                return 0;
            }
        }
    }
    printf("NO\n");
    return 0;
}