2 solutions
-
0
P1151 night的奇妙冒险之菱形宝石 题解
题意分析:
本题的基本思路就是简单字符串匹配加上打印菱形。由于字符串的长度很小,所以可以用暴力匹配,即主串和模式串一个字符一个字符的匹配,如果匹配成功则计数器加一,模式串的匹配指针指向开头,然后接着主串匹配;如果匹配失败,就模式串从头与主串的下一个字符开始匹配。如果具体情况还是不懂,就去上网详细查找资料或者问问自己的师傅。 本题的重点其实是菱形的打印,这个需要花费一定的时间找到规律,可以先假设打印的是实心菱形,每一行先打印空格然后再打印星号,规律就确定了每一行需要先打印多少空格再打印多少星号,想打印出空心就在实心的基础上在打印星号的地方加上一个判断,即根据规律在特定的地方打上星号其他的地方就打印空格。具体的规律多举几个例子归纳即可得出。
参考代码:
#include <bits/stdc++.h> using namespace std; char S[100],T[100]; int main() { int N; cin >> N; while (N--) { cin >> S >> T; int i = 0, j = 0; int ans = 0; while (i < strlen(S)) { if (S[i] == T[j]) { i++; j++; } else { i = i - j + 1; j = 0; } if (j == strlen(T)) { ans++; j = 0; } } if (ans == 0 || ans == 1) { cout << "构造失败!" << endl; continue; } int totalLevel; totalLevel = ans; int f = 0; for (int i = 1; i <= totalLevel; i++) { if (i == totalLevel && f == 0) { //打印完上部分开始打印下部分 i = 0; f = 1; continue; } if (f == 0) { //上三角形 for (int j = 1; j <= totalLevel - i; j++) { //打出空格 cout << " "; } for (int j = 1; j <= 2 * i - 1; j++) { //打出星号,中间留空 if (j == 1 || j == 2 * i - 1) { cout << "*"; } cout << " "; } cout <<endl; } if (f == 1) { //下三角形 for (int j = 1; j <= i - 1; j++) { cout << " "; } for (int j = 1; j <= 2 * (totalLevel + 1 - i) - 1; j++) { if (j == 1 || j == 2 * (totalLevel + 1 - i) - 1) { cout << "*"; } cout << " "; } cout <<endl; } } } }
Information
- ID
- 147
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- # Submissions
- 101
- Accepted
- 7
- Uploaded By