洛谷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;
}

 

posted @ 2019-07-11 16:07  wushuyng  阅读(183)  评论(0)    收藏  举报