P1101 單詞方陣-洛谷
阿新 • • 發佈:2019-01-11
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;
}