P1101 单词方阵(C++)

会有一股神秘感。 提交于 2020-01-21 16:49:15

题目描述

给一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<bits/stdc++.h>//Talk is cheap. Show me the code.
using namespace std;
char a[100][100];
int b[100][100] = {0};
int n;
int x[8] = { 0,1,0,-1,1,-1,1,-1 };
int y[8] = { 1,0,-1,0,-1,1,1,-1 };
string beginn = "yizhong";

class node
{
public:
	int x, y;
}temp[7];

void print()
{
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
			if (b[i][j] == 1)
				cout << a[i][j];
			else
				cout << '*';
		cout << endl;
	}
}
void dfs(int ii, int jj, int d, int num)//位置、方向、第num位
{
	if (num == 7)
		for (int i = 0; i < 7; i++)
			b[temp[i].x][temp[i].y] = 1;
	else
		if (a[ii][jj] == beginn[num])
		{
			temp[num].x = ii;
			temp[num].y = jj;
			dfs(ii + x[d], jj + y[d], d, num+1);
		}
}
int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			cin >> a[i][j];
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			if (a[i][j] == 'y')
				for (int z = 0; z < 8; z++)
					dfs(i, j, z, 0);
	print();
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!