2 solutions

  • 0
    @ 2021-11-1 20:07:08
    #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
      @ 2021-10-30 11:32:37

      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