2518: 【普及-】【P1101】单词方阵

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:12 解决:5

题目描述

给一 lns="http://www.w3.org/1998/Math/MathML">× 的字母方阵,内可能蕴含多个 yizhong 单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 lns="http://www.w3.org/1998/Math/MathML">8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 * 代替,以突出显示单词。例如:

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

输入

第一行输入一个数 lns="http://www.w3.org/1998/Math/MathML">。(lns="http://www.w3.org/1998/Math/MathML">7100)。

第二行开始输入 lns="http://www.w3.org/1998/Math/MathML">× 的字母矩阵。

输出

突出显示单词的 lns="http://www.w3.org/1998/Math/MathML">× 矩阵。

样例输入 复制

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

样例输出 复制

*******
*******
*******
*******
*******
*******
*******

提示

#include<bits/stdc++.h>
using namespace std;
int n,mark[105][105]={0},dx[8]={0,-1,-1,-1,0,1,1,1},dy[8]={-1,-1,0,1,1,1,0,-1};
char fz[105][105]={0};
string yz="yizhong";
void search(int x,int y) {
	for(int i=0;i<8;i++) {
		int tx,ty,m=1;
		for(int j=0;j<yz.size();j++) {
			tx=x+j*dx[i];
			ty=y+j*dy[i];
			if(fz[tx][ty]!=yz[j]) {
				m=0;
				break;
			}
		}
	    if(m==0) continue;
	    for(int j=0;j<yz.size();j++) {
		    mark[x+j*dx[i]][y+j*dy[i]]=1;
	    }		
	}

}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
			cin>>fz[i][j];
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
			search(i,j);
		}
	}
	for(int i=1;i<=n;i++) {
		for(int j=1;j<=n;j++) {
			if(mark[i][j]) cout<<fz[i][j];
			else cout<<"*";
		}
		cout<<endl;
	}	
	return 0;
}