1. 程式人生 > >P1101 單詞方陣-洛谷

P1101 單詞方陣-洛谷

P1101 單詞方陣

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