C++ C+中形状的并集和交集+;

C++ C+中形状的并集和交集+;,c++,math,set,C++,Math,Set,下面的程序根据用户输入的行数和长度分别打印出菱形和正方形。这些形状是带“\n”的字符串,表示换行符。我想知道是否有一种方法可以显示两个形状的并集和交集,如下所示: // Example program #include <iostream> #include <string> using namespace std; int main() { int n, i, j, space = 1; cout<<"enter n f

下面的程序根据用户输入的行数和长度分别打印出菱形和正方形。这些形状是带“\n”的字符串,表示换行符。我想知道是否有一种方法可以显示两个形状的并集和交集,如下所示:

// Example program
#include <iostream>
#include <string>
using namespace std;
int main()
{



        int n, i, j, space = 1;
        cout<<"enter n for diamond ";
        cin>>n;
        string dia = "";

        space = n - 1;
        for (j = 1; j <= n; j++) 
        {
            for (i = 1; i <= space; i++) 
            {
                dia = dia + " ";
            }
            space--;
            for (i = 1; i <= 2 * j - 1; i++) 
            {
                dia=dia+ '*' ;                
            }
            dia = dia+ '\n' ;
        }
        space = 1;
        for (j = 1; j <= n - 1; j++) 
        {
            for (i = 1; i <= space; i++) 
            {
                dia = dia + " ";
            }
            space++;
            for (i = 1; i <= 2 * (n - j) - 1; i++) 
            {
                dia=dia+ '*' ;
            }
            dia = dia+ '\n' ;
        }
        cout<<dia;


        cout<<"enter s for square ";
        int sides;
        cin>>sides;
        string square = "";
        for(int i = 0; i<= sides-1; i++){
            if ( i != 0){
                square = square + '\n';
            }
            for (int j = 0; j<=sides-1; j++){
                square = square + '*';
            }
        }
        cout<<square;
        string intersect = "";
        cout<<""<<endl;

}

并集和交集的所需输出:

Union:
****
****
*****
****
 *

Intersection:
  *
 ***
****
 ***

您应该更深入地研究二维布尔数组:

int n, s;
cin >> n;
cin >> s;

bool diamond[n*2 - 1][n*2 - 1] {}, square[s][s] {};

void fillDiamond() {
    int space = n - 1;
    for(int i = 0; i < n*2-1; i++) {
        for(int j = 0; j < n*2-1; j++) {
            if(j <= space && j > n*2-1 - space) {
                diamond[i][j] = true;
            }
        }
        if(i <= n) {
            space--;
        } else {
            space++;
        }
    }
}

void fillSquare() {
    for(int i = 0; i < s; i++) {
        for(int j = 0; j < s; j++) {
            square[i][j] = true;
        }
    }
}

fillDiamond();
fillSquare();

bool intersection[max(s, n*2-1)][max(s, n*2-1)] {}, union[max(s, n*2-1)][max(s, n*2-1)] {};

void fillIntersection() {
    for(int i = 0; i < max(s, n*2-1); i++) {
        for(int j = 0; j < max(s, n*2-1); j++) {
            intersection[i][j] = square[i][j] && diamond[i][j]; // check not to go out of bounds!
        }
    }
}

void fillUnion() {
    for(int i = 0; i < max(s, n*2-1); i++) {
        for(int j = 0; j < max(s, n*2-1); j++) {
            union[i][j] = square[i][j] || diamond[i][j]; // check not to go out of bounds!
        }
    }
}

fillIntersection();
fillUnion();

// print
int n,s;
cin>>n;
cin>>s;
布尔钻石[n*2-1][n*2-1]{},正方形[s]{};
空白填充钻石(){
int空间=n-1;
对于(int i=0;i如果(我从创建一个数据结构来保存你的值开始,那么你可以做你想做的事情。当然有一种方法。我建议你从编写一个函数
printLine(inti,intj)开始
打印由0到i的空格和i+1到j的星号组成的单行。然后重写以前的代码以使用该函数。然后编写新代码以计算并集和交集行的i和j值。
int n, s;
cin >> n;
cin >> s;

bool diamond[n*2 - 1][n*2 - 1] {}, square[s][s] {};

void fillDiamond() {
    int space = n - 1;
    for(int i = 0; i < n*2-1; i++) {
        for(int j = 0; j < n*2-1; j++) {
            if(j <= space && j > n*2-1 - space) {
                diamond[i][j] = true;
            }
        }
        if(i <= n) {
            space--;
        } else {
            space++;
        }
    }
}

void fillSquare() {
    for(int i = 0; i < s; i++) {
        for(int j = 0; j < s; j++) {
            square[i][j] = true;
        }
    }
}

fillDiamond();
fillSquare();

bool intersection[max(s, n*2-1)][max(s, n*2-1)] {}, union[max(s, n*2-1)][max(s, n*2-1)] {};

void fillIntersection() {
    for(int i = 0; i < max(s, n*2-1); i++) {
        for(int j = 0; j < max(s, n*2-1); j++) {
            intersection[i][j] = square[i][j] && diamond[i][j]; // check not to go out of bounds!
        }
    }
}

void fillUnion() {
    for(int i = 0; i < max(s, n*2-1); i++) {
        for(int j = 0; j < max(s, n*2-1); j++) {
            union[i][j] = square[i][j] || diamond[i][j]; // check not to go out of bounds!
        }
    }
}

fillIntersection();
fillUnion();

// print