P1101 单词方阵-洛谷

版权声明:只要我还活着,我就要凿穿codeforces. https://blog.csdn.net/UnKfrozen/article/details/84979913

P1101 单词方阵

题目描述

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

输入 输出
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
* yizhong
gy******
n* i*****
o** z****
h* ** h***
z**** o**
i ***** n*
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

解析

  让我彻底放弃了string的题目
  搜索典型题目,先找,找到’y’或’g’,然后向左,向下,向左下,向右下四种方向查找,如果找到了整个字符串,则把它复制到t字符串内.
  之所以不往回找是因为之前的位置已经查过了,不用重复查找.
  emmm,之所以写的这么长,不是因为我懒得简化了,绝对不是

#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<stdio.h>
#include<stdlib.h>
#include<map>
#ifndef NULL
#define NULL 0
#endif
using namespace std;

class vec {
public:
	int ix, iy;
}cur[7];
int n,dx[] = { 1,0,1,-1 }, dy[] = { 0,1,1,1 };
char s[110][110] ,t[110][110] ,s1[7] = {'y','i','z','h','o','n','g'};
void dfs(int x, int y, int deep, int p, bool f)
{
	if (deep == 7) {
		for (int i = 0; i < deep; i++)
			if (f)
				t[cur[i].ix][cur[i].iy] = s1[i];
			else
				t[cur[i].ix][cur[i].iy] = s1[deep - i-1];
	}
	x += dx[p], y += dy[p];
	if(x>=0&&x<n&&y>=0&&y<n)
		if(f&&s[x][y] == s1[deep]){
			cur[deep].ix = x, cur[deep].iy = y;	
			dfs(x, y, deep + 1, p, f);
			cur[deep].ix = 0, cur[deep].iy = 0;
		}
		else if (s[x][y] == s1[6 - deep] && !f) {
			cur[deep].ix = x, cur[deep].iy = y;
			dfs(x, y, deep + 1, p, f);
			cur[deep].ix = 0, cur[deep].iy = 0;
		}
}
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> s[i];
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++) {
			if (s[i][j] == 'y') {
				cur[0].ix = i, cur[0].iy = j;
				for (int k = 0; k < 4; k++)
					dfs(i, j, 1, k, 1);
				cur[0].ix = 0, cur[0].iy = 0;
			}
			else if (s[i][j] == 'g') {
				cur[0].ix = i, cur[0].iy = j;
				for (int k = 0; k < 4; k++)
					dfs(i, j, 1, k, 0);
				cur[0].ix = 0, cur[0].iy = 0;
			}
		}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++)
			if (t[i][j] == 0)
				cout << '*';
			else
				cout << t[i][j];
		cout << endl;
	}
	return 0;
}  

猜你喜欢

转载自blog.csdn.net/UnKfrozen/article/details/84979913