zoukankan      html  css  js  c++  java
  • 洛谷p1101 单词方阵

    https://www.luogu.org/problemnew/show/P1101

    题目描述

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

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

    输入输出格式

    输入格式:

     

    第一行输入一个数n。(7n100)。

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

     

    输出格式:

     

    突出显示单词的n×n矩阵。

     

    输入输出样例

    输入样例#1: 复制
    7
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    
    输出样例#1: 复制
    *******
    *******
    *******
    *******
    *******
    *******
    *******
    
    输入样例#2: 复制
    8
    qyizhong
    gydthkjy
    nwidghji
    orbzsfgz
    hhgrhwth
    zzzzzozo
    iwdfrgng
    yyyygggg
    输出样例#2: 复制
    *yizhong
    gy******
    n*i*****
    o**z****
    h***h***
    z****o**
    i*****n*
    y******g

    染色问题解决。

    #include <stdio.h>
    #include <iostream>
    #include <cstdlib>
    #include <cmath>
    #include <cctype>
    #include <string>
    #include <cstring>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <set>
    #include <map>
    #include <ctime>
    #include <vector>
    #include <fstream>
    #include <list>
    #include <iomanip>
    #include <numeric>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    #define me0(s) memset(s,0,sizeof(s))
    #define me1(s) memese(s,1,sizeof(s))
    const int inf = 0x3f3f3f3f;
    const int N=100005;
    int vis[105][105];
    char a[110][110];
    char book[7]="izhong";
    int dir[8][2]={{0,1},{1,1},{1,0},{1,-1},{-1,1},{-1,0},{-1,-1},{0,-1}};
    //相反加和为7
    int dx,dy;
    int n;
    int ans=0;
    void ranse(int x,int y,int step,int d){
        if(step>=7) return ;
        vis[x][y]=1;
        dx=x+dir[d][0];
        dy=y+dir[d][1];
        ranse(dx,dy,step+1,d); //染色保证方向不变
    }
    void dfs(int x,int y,int step,int d){
        if(x<0||x>n||y<0||y>n) return ;
        if(step>=6){
            ranse(x,y,0,7-d);
            return ;
        }
        dx=x+dir[d][0];
        dy=y+dir[d][1];
        if(a[dx][dy]!=book[step]) return ;
        dfs(dx,dy,step+1,d);//沿着一个方向一直走
    }
    int main(int argc, char * argv[]) 
    {
        std::ios::sync_with_stdio(false);
        cin>>n;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin>>a[i][j];
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(a[i][j]=='y'){
                    for(int d=0;d<8;d++){ //8个方向
                        dfs(i,j,0,d);
                    }
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(vis[i][j]!=1)
                    a[i][j]='*';
                cout<<a[i][j];
            }
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    代码格式化[转]
    ASP.NET错误大杂烩
    Web考勤管理系统 .net 2005 开发
    Ftp 类
    c#中Split等分割字符串的几种方法
    强大的firebug 使用 介绍
    一页面多个文本框回车提交不同事件问题解决
    Ajax电子书下载 发现的好东东贴上了
    编程技术书籍[转]
    推荐下权威的《IT十年经典书系列》1打
  • 原文地址:https://www.cnblogs.com/wushengyang/p/11170651.html
Copyright © 2011-2022 走看看