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。(7≤n≤100)。
第二行开始输入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;
}