2 solutions
-
0
#include <iostream> #include <string> using namespace std; string str, s; //lx构建菱形 void lx(int n) { //打印上半部分包括中间一行 for (int i = 1; i <= n; i++) { if (i == 1) {//判断是不是第一行。这行只需要打印一个* for (int j = 0; j < n - 1; j++) printf(" "); printf("*\n"); } else { for (int j = 0; j < n - i; j++) printf(" "); printf("*"); for (int j = 0; j < 2 * (i - 1); j++) printf(" "); printf("*\n"); } } //打印下半部分 for (int i = 1; i <= n - 1; i++) { if (i == n - 1) {//判断是不是最后一行。这行只需要打印一个* for (int j = 0; j < n - 1; j++) printf(" "); printf("*\n"); } else { for (int j = 0; j < i; j++) printf(" "); printf("*"); for (int j = 0; j < (n - 1) * 2 - 2 * i; j++) printf(" "); printf("*\n"); } } } //计算ss中子串s的个数返回count int fstr(string ss, string s) { int count = 0, l, l2; l2 = s.size(); while (1) { l = ss.rfind(s); if (l == -1)break; count++; ss.replace(l, l2, ""); } return count; } int main() { int n, sum = 0; cin >> n; while (n--) { cin >> str >> s; sum = fstr(str, s); if (sum == 0 || sum == 1) {//一个星号也是构造错误!!,别问(555 printf("构造失败!\n"); continue; } lx(sum); } return 0; }
-
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; } } } }
- 1
Information
- ID
- 147
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- # Submissions
- 101
- Accepted
- 7
- Uploaded By