c++ - 打印雷电般的图案

标签 c++

我最近在一次采访中遇到了这个问题,其中我必须打印一个图案。该模式看起来微不足道,但我无法找出解决方案。请帮助我找出代码中的错误。

下面是测试用例:

n = 1
x


n = 2
 x
x x
 x


n = 3
  x
   x
x o x
 x
  x


n = 5
    x
     x
    o x
     o x
x o x o x
 x o
  x o
   x
    x


n = 10
         x
          x
         o x
          o x
         x o x
          x o x
         o x o x
          o x o x
         x o x o x
x o x o x x o x o x
 x o x o x
  x o x o
   x o x o
    x o x
     x o x
      x o
       x o
        x
         x

这是我的尝试:

#include <iostream>
using namespace std;

string reverse(string s) {
  int start = 0, end = s.size()-1;
  while(start<end) {
    char temp = s[start];
    s[start] = s[end];
    s[end] = temp;
    ++start;
    --end;
  }
  return s;
}

int main() {
  int n;
  cin>>n;
  int count=0;
  string s = "X";
  bool wasLastX = true;
  for (int i=1;i<=n-1;++i) {
    for(int j=1;j<=n-1;++j) {
      cout<<" ";
    }
    cout<<s<<endl;
    if (i == n-1) {
      break;
    }
    if (s[0] == 'X' || s[0] == 'O') {
      s.insert(s.begin(), ' ');
    }
    else {
      if (wasLastX) {
        s.insert(s.begin(), 'O');
        wasLastX = false;
      }
      else {
        s.insert(s.begin(), 'X');
        wasLastX = true;
      }
    }
    ++count;
  }

  string temp = s;
  if (n%2 == 0) {
    cout<<s<<" "<<s<<endl;
  }
  else {
    if (s[1] == 'X') {
      s.insert(s.begin(), 'O');
    }
    else if (s[1] == 'O') {
      s.insert(s.begin(), 'X');
    }
    cout<<reverse(temp)<<s<<endl;
  }

  int count1 = 0;
  for (int i=1;i<=n-1;++i) {
    cout<<" ";
    for(int j=1;j<=count1;++j) {
      cout<<" ";
    }
    cout<<temp<<endl;
    temp.pop_back();
    ++count1;
  }
  return 0;
}

首先打印上半部分,然后从生成的上半部分开始,将下半部分反转并再次打印。

这是我的输出:

n = 1
xx

n = 3
  X
   X
X O X
  X

n = 5
    X
     X
    O X
     O X
X O X O X
  O X
   O
    O

但是,该代码对于 n = 2 和 n = 10 运行良好。但是,对于 n = 4,它再次显示错误的输出。所以,我不能概括说它只适用于 n 的奇数值。 对于 n = 4,我得到这个,这是错误的,因为中间行之后的所有元素都应该以 x 开头,而我的是以 o 开头。

   X
    X
   O X
O X O X
 O X
  O
   O

最佳答案

因为最初这个问题附加了一个 [java] 标签,所以我尝试使用 java 代码来实现它。希望这有助于构建 C 代码逻辑

public class ThunderBoltPattern {
public static void main(String[] args) {
    int input = 5;
    int evenOddFactor = (input % 2 == 0) ? 0 : 1; // If it is even, add 1 else it should be 0
    // length on pattern based on input
    int length = input * 2 - evenOddFactor;

    // Using character array to store individual character at various point
    char[][] array = new char[length][length];
    int factor = 0;

    while (factor < input) {
        for (int i = 0 + factor, j = input - 1; i < input; i++, j++) {
            array[i][j] = 'x';
            array[j][i] = 'x';
        }
        for (int i = 2 + factor, j = input - 1; i < input; i++, j++) {
            array[i][j] = 'o';
            array[j][i] = 'o';
        }
         // Because character are repeated on same line after 4 digit, using 4 as factor
        factor += 4;
    }

    for (char[] chs : array) {
        for (char ch : chs) {
            System.out.print(ch);
        }
        System.out.println();
    }
}
}

关于c++ - 打印雷电般的图案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51574197/

相关文章:

c++ - 为我的 Visual Studio C++ 项目配置目标平台

c++ - 如何维护 2 个对象列表

c++ - 检测堆损坏

c++ - 使用 new 表达式创建内置类型

c++ - 防止模板参数上的 ADL

c++ - 为什么我不能用 "\x"初始化字符串

c++ - 根据运行时值调用不同的模板函数特化

c++ - 我怎样才能从内置的 DLL 中获得清晰的导出函数名称?我总是得到原始名称+胡言乱语

c++ - C++是否保证参数评估的原子性?

c++ - 在 linux 环境中,如何在 C++ 中将 X 文件作为数字读入 RAM?