洛谷P1101单词方阵

题目描述
给一 nn n ∗ n 的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:

    输入:                 输出:
    qyizhong              *yizhong
    gydthkjy              gy******
    nwidghji              n*i*****
    orbzsfgz              o**z****
    hhgrhwth              h***h***
    zzzzzozo              z****o**
    iwdfrgng              i*****n*
    yyyygggg              y******g

输入输出格式
输入格式:
第一行输入一个数 n n (7n100)

第二行开始输入 nn n ∗ n 的字母矩阵。

输出格式:
突出显示单词的 nn n ∗ n 矩阵。
解题思路:
0)简化一下题目的条件,对于每个以’y’开头的字符串而言,其搜索方向只有8邻域
1)利用结构体记录一下成功连接字符串时的路径,然后给路径上的点做上标记
2)注意在搜索是cnt作为局部变量和全局变量的区别

#include <iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
char map[105][105];
int mark[105][105];
int n,k=0;

int dir[][2]={{-1,0},{-1,1},{-1,-1},{0,1},{0,-1},{1,0},{1,-1},{1,1}};//8个不同的搜索方向 
char str[]={'y','i','z','h','o','n','g'};
struct loc{
    int x,y;
}c[10];//记录路径 
void solve(int x,int y,int k,int cnt){//当前点的x,y坐标,8个方向中的特定方向,当前已经连接的字母个数 
    if(cnt==7){//结束条件
        for(int i=0;i<7;i++){
            mark[c[i].x][c[i].y]=1;
        }
        return;
    }

    int nx=x+dir[k][0];
    int ny=y+dir[k][1];

    if(nx>=0&&nx<=n-1&&ny>=0&&ny<=n-1){
        if(map[nx][ny]==str[cnt]){
        c[cnt].x=nx;
        c[cnt].y=ny;
        solve(nx,ny,k,cnt+1); 
    }
 }  
}
int main(int argc, char** argv) {
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%s",map[i]);
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(map[i][j]=='y'){
                c[0].x=i,c[0].y=j; 
                for(int k=0;k<=7;k++)
                    solve(i,j,k,1);
            }
        }
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(mark[i][j])
                printf("%c",map[i][j]);
            else
                printf("*");
        }
        printf("\n");
    }
    return 0;
}
posted @ 2018-09-10 21:13  xzhws  阅读(30)  评论(0编辑  收藏  举报