首页 > 试题广场 >

叠筐

[编程题]叠筐
  • 热度指数:4744 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
我们需要使用筐的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。

输入描述:
输入是一个个的三元组,分别是,外筐尺寸n(n为满足1≤n≤79的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符,输入数据有多组。


输出描述:
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
示例1

输入

11 * +
5 W @

输出

 +++++++++ 
+*********+
+*+++++++*+
+*+*****+*+
+*+*+++*+*+
+*+*+*+*+*+
+*+*+++*+*+
+*+*****+*+
+*+++++++*+
+*********+
 +++++++++ 

 WWW 
W@@@W
W@W@W
W@@@W
 WWW 
输出要注意!      
换行在打印图案前换,图案在换行后打印。第一个图案不打印换行。
        if(flag){
           printf("\n"); 
        }else{
            flag = true;
        }
      打印图案
编辑于 2016-02-19 23:37:27 回复(2)
用C++的过不了可以加上这三个开头处理试试
1. 对(n-5)%4==0的情况内外符号兑换
2. 从第二个图像开始,开头需要打印空行
3. 对n==1的情况打印外部符号

if((n-5)%4==0){
    char keep=inner;
     inner=outer;
     outer=keep;
 }
if (flag) {
    flag = false;
}
else {
    cout << endl;
}
if (n == 1) {
    cout << outer << endl;
    continue;
}
编辑于 2019-05-09 12:29:22 回复(0)
5 C #

对应输出应该为:


CCC
C###C
C#C#C
C###C
CCC

你的输出为:

###
#CCC#
我已经傻了
发表于 2018-06-04 13:27:38 回复(0)


#include <stdio.h>
#include<stdbool.h>

char matrix[80][80];
int main(){
    int n; //叠筐大小
    char a,b;
    bool firstCase = true;
    while(scanf("%d %c %c",&n,&a,&b)!=EOF){
        if(firstCase==true){
            firstCase=false;
            
        }else{
            printf("\n");
        }
        for(int i=0;i<=n/2;++i){
            int j=n-i-1;
            int length=n-2*i;
            char c;
            if((n/2-i)%2==0){
                c=a;
            }else{
                c=b;
            }
            for(int k=0;k<length;++k){
                matrix[i][i+k]=c;
                matrix[i+k][i]=c;
                matrix[j][j-k]=c;
                matrix[j-k][j]=c;
            }
        }
        if(n!=1){
            matrix[0][0]=' ';
            matrix[0][n-1]=' ';
            matrix[n-1][0]=' ';
            matrix[n-1][n-1]=' ';
        }
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                printf("%c",matrix[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}


char matrix[80][80];

int main(){

    int n; //叠筐大小

    char a,b;

    bool firstCase = true;

    while(scanf("%d %c %c",&n,&a,&b)!=EOF){

        if(firstCase==true){

            firstCase=false;

            

        }else{

            printf("\n");

        }

        for(int i=0;i<=n/2;++i){

            int j=n-i-1;

            int length=n-2*i;

            char c;

            if((n/2-i)%2==0){

                c=a;

            }else{

                c=b;

            }

            for(int k=0;k<length;++k){

                matrix[i][i+k]=c;

                matrix[i+k][i]=c;

                matrix[j][j-k]=c;

                matrix[j-k][j]=c;

            }

        }

        if(n!=1){

            matrix[0][0]=' ';

            matrix[0][n-1]=' ';

            matrix[n-1][0]=' ';

            matrix[n-1][n-1]=' ';

        }

        for(int i=0;i<n;++i){

            for(int j=0;j<n;++j){

                printf("%c",matrix[i][j]);

            }

            printf("\n");

        }

    }

    return 0;

}


发表于 2021-01-16 10:47:19 回复(0)
从中心向边缘交替绘制,新字符覆盖老字符,注释写的清楚了
#include <iostream>
using namespace std;
int main()
{
	int n;
	char a, b;
	int mark[85][85]; //位置矩阵
	while (cin >> n >> a >> b)
	{
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				mark[i][j] = 2;

		bool flag = 1; //中心是字符a

		int mid = n / 2; //中心坐标:(mid,mid)

		//由中心向边缘交替绘字符,新字符覆盖老字符
		for (int i = 0; i <= mid; i++) //交替绘制mid + 1次
		{
			if (flag == 1) //填字符a
			{
				for (int j = 0; j < n; j++)
				{
					mark[mid + i][j] = 1; //中心上行
					mark[j][mid + i] = 1; //中心右列
					mark[mid - i][j] = 1; //中心下行
					mark[j][mid - i] = 1; //中心左列
				}
				flag = 0;
			}
			else //填字符b
			{
				for (int j = 0; j < n; j++)
				{
					mark[mid + i][j] = 0;
					mark[j][mid + i] = 0;
					mark[mid - i][j] = 0;
					mark[j][mid - i] = 0;
				}
				flag = 1;
			}
		}
		//四个角置为空格
		mark[0][0] = 2;
		mark[0][n - 1] = 2;
		mark[n - 1][0] = 2;
		mark[n - 1][n - 1] = 2;
		//打印图形
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (mark[i][j] == 1)
					cout << a;
				else if (mark[i][j] == 0)
					cout << b;
				else
					cout << " ";
			}
			cout << endl;
		}
	}

	return 0;
}



编辑于 2021-03-18 14:56:39 回复(0)
    第一种代码没有使用逻辑上从外圈到内圈的思想,寻找前i/2行规律,单独输
出i/2+1行,利用vector存储前i/2行,然后逆序输出,得到最终结果。注意细节:
每组输出完后要换行!
    第二种代码使用逻辑上从外圈到内圈的思想,利用cycle圈数来辅助控制输出
两种代码分别如下:

第一种:
#include <vector>
using namespace std;

vector<string> lines;
//声明一个动态数组lines,存储准备输出的前i/2(取整)行数据
void PrintLine(int i, int x, char y, char z);
//将前i/2数据每行的输出操作模块化为PrintLine函数
int main() {
    int x = 0; char y = 0; char z = 0; 
    while (cin >> x >> y >> z) {
    //多组数据循环输入
        lines.clear();
        //每组数据输入后,清空vector容器
        if ((x - 1) % 4 == 0) {
        /*以下代码是基于Z(外框花色字符)为每行第一个输入字符的,
        但是每行的第一个输入字符是随着X(从1,3,5,7,9等等)在Y(中
        心花色字符)和Z(外框花色字符)之间交替的,比如输入:1 A !
        每行第一个字符为A,输入:3 B @,每行第一个字符为@,输
        入:5 @ W,每行第一个字符为@,以此不断交替,当(x - 1)
        % 4 =1时,直接执行下列代码,当(x - 1)% 4 =0时,需要交
        换Y,Z的值来达到交替效果。*/
            swap(y, z);
        }
        for (int i = 1; i <= x / 2; ++i) {
        //先输出前i/2(取整)行
            PrintLine(i, x, y, z);
        }
        for (int j = 1; j <= x; ++j) {
        //第(i / 2 + 1)行,即中间行,单独输出
            char temp = (j % 2 == 1 ? z : y);
        //通过对列号%2来完成字符的交替效果
            cout << temp;
        }
        cout << endl;
        for (int i = lines.size() - 1; i >= 0; --i) {
        //将存储在vector里的前i/2个字符串逆序输出
            cout << lines[i] << endl;
        }
        cout << endl;
    }
    return 0;
}

void PrintLine(int i, int x, char y, char z) {
    string line;
    if (i == 1) {
    //第一行首尾两个空格,特殊处理
        line += ' ';
        cout << ' ';
        for (int j = 2; j <= x - 1; ++j) {
            line += z;
            cout << z;
        }
        line += ' ';
        cout << ' ' << endl;
        lines.push_back(line);
        //每输出完一行(存在line里),压入lines中
    }
    else {
        int K = 0; 
        for (int k = 1; k <= i; ++k) {
        /*观察样例输出结果,发现每一行可以划分为三个区域:
        1到j,j+1到x-j,x-j+1到x,以此进行循环*/
            char temp = (k % 2 == 1 ? z : y);
            line += temp;
            cout << temp;
            K = k;
        }
        while (K + 1 <= x - i) {
            char temp = (i % 2 == 1 ? z : y);
            line += temp;
            cout << temp;
            ++K;
        }
        for (int m = x - i + 1; m <= x; ++m) {
            char temp = (m % 2 == 0 ? y : z);
            line += temp;
            cout << temp;
        }
        lines.push_back(line);
        cout<< endl;
    }
}

第二种:
#include<iostream>
#include<vector>
using namespace std;

int main() {
	int x = 0; char y = 0; char z = 0; int cycle = 0;
	while (cin >> x >> y >> z) {
		vector<vector<char>>matrix(x, vector<char>(x, ' '));// rows = x; cols = x;
		if ((x + 1) % 4 != 0) {
			swap(y, z);
		}
		for (cycle = 0; cycle <= x / 2 ; ++cycle) {
			for (int i = cycle; i <= x -1 - cycle ; ++i) {
				for (int j = cycle; j <= x -1 - cycle ;++j) {
					char temp = (cycle % 2 == 0 ? z : y);
					if (i == cycle) {
						matrix[i][j] = temp;
						matrix[x - 1 - cycle][j] = temp;
					}
					else {
						matrix[i][cycle] = temp;
						matrix[i][x - 1 - cycle] = temp;
					}
				}
			}
		}
		if (x != 1) {
			matrix[0][0] = ' '; matrix[0][x - 1] = ' ';
			matrix[x - 1][0] = ' '; matrix[x - 1][x - 1] = ' ';
		}
		for (int i = 0; i <= x - 1; ++i) {
			for (int j = 0; j <= x - 1; ++j) {
				cout << matrix[i][j];
			}
			cout << endl;
		}
		cout << endl;
		matrix.clear();
	}
	return 0;
}


编辑于 2024-01-14 15:11:26 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class _t386 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while(in.hasNext()){
			int n=in.nextInt();
			String str=in.nextLine();
//			long start=System.currentTimeMillis();
			char[] carr = str.toCharArray();
			char inside=carr[1];
			char outside=carr[3];
			if(n==1){
				System.out.println(outside);
				continue;
			}
			char[] record=new char[n];
			
			char[][] rs=new char[(n+1)/2][n];
			char c='\0';
			for (int i = 0,k=0; i < (n+1)/2; i++,k++) {
				if((i+1)%2==0){
					c=inside;
				}
				else{
					c=outside;
				}
				record[k]=c;
				
				int m=0,count=0;
				while(record[m]!='\0'){
					rs[i][m]=record[m++];
					count++;
				}
				
				int len=n-m;
				for (int j = m; j < len; j++) {
					rs[i][j]=c;
				}
				
				m=len;
				while(count!=0 && record[--count]!='\0'){
					rs[i][m++]=record[count];
				}
//				System.out.println(Arrays.toString(rs[i]));
			}
			
			rs[0][0]=' ';
			rs[0][n-1]=' ';
			
			//Up
			for (int i = 0; i < (n+1)/2; i++) {
				for (int j = 0; j < n; j++) {
					System.out.printf("%c",rs[i][j]);
				}
				System.out.println();
			}
			
			//Down
			for (int i = (n+1)/2-2; i >= 0; i--) {
				for (int j = 0; j < n; j++) {
					System.out.printf("%c",rs[i][j]);
				}
				System.out.println();
			}
			System.out.println();
//			long end=System.currentTimeMillis();
//			System.out.println("start:"+start);
//			System.out.println("end:"+end);
//			System.out.println(end-start);
		}
	}
}
什么判断机制啊,最长79长度的输出时间差也才200mm左右,凭什么说超时。

发表于 2017-06-14 10:47:31 回复(0)
#include <algorithm>
#include <iostream>

using namespace std;

int n;
char a, b, tmp;
char matrix[80][80];
int flag = 0;

int main() {
  while (cin >> n >> a >> b) {
    if (!flag)
      flag = 1;
    else
      cout << endl;
    if ((n / 2) % 2)
      swap(a, b);
    int l = (n + 1) / 2;
    for (int i = 0; i < l; i++) {
      tmp = i % 2 ? b : a;
      for (int j = i; j < n - i; j++) {
        matrix[i][j] = matrix[j][i] = matrix[n - i - 1][j] =
            matrix[j][n - i - 1] = tmp;
      }
    }

    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (((i == 0 && j == 0) || (i == n - 1 && j == n - 1) ||
            (i == 0 && j == n - 1) || (i == n - 1 && j == 0)) && n!=1)
          cout << " ";
        else
          cout << matrix[i][j];
      }
      cout << endl;
    }
  }
  return 0;
}
过关咯

发表于 2024-08-15 18:07:17 回复(0)
#include <cstdio> using namespace std; int main(){ int n; char inner; char outer; bool flag =true; while(scanf("%d %c %c",&n,&inner,&outer)!=EOF){ char pattern[80][80]={0}; if(flag==true){ flag=false;
        } else{
            printf("\n");
        } int init =n/2; int length=1; int x; int y; char cur=inner; for ( length = 1, x=init,y=init; length <=n ; length=length+2,--x,--y)
        { for (int i = x,j=y; i < x+length; ++i) { pattern[i][j]=cur;
            } for (int i = x,j=y; j < y+length; ++j) { pattern[i][j]=cur;
            } for (int i = x+length-1,j=y; j < x+length; ++j) { pattern[i][j]=cur;
            } for (int i = x,j=y+length-1; i < x+length; ++i) { pattern[i][j]=cur;
            } if (cur==inner){ cur=outer;
            } else{ cur=inner;
            }
        } if(n!=1){ pattern[0][0]=' '; pattern[n-1][0]=' '; pattern[0][n-1]=' '; pattern[n-1][n-1]=' ';
        } for (int i = 0; i < n; ++i) {
            printf("%s\n",pattern[i]);
        }
    }
}
编辑于 2024-03-21 19:49:09 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    int n;
    // colors [inner_color, outer_color]
    char colors[2];
    char cur_color;
    char pattern[100][100] = {0};
    while(scanf("%d %c %c", &n, &colors[0], &colors[1]) != EOF) {
        memset(pattern, 0, 10'000);
        int layer;
        for(layer = 0; layer <= n/2; ++layer) {
            cur_color = colors[layer%2];
            // Upper left -> upper right
            for(int i = n/2-layer, j = n/2-layer; j <= n/2+layer; ++j) {
                pattern[i][j] = cur_color;
            }
            // Lower left -> Lower right
            for(int i = n/2+layer, j = n/2-layer; j <= n/2+layer; ++j) {
                pattern[i][j] = cur_color;
            }
            // Upper left -> Lower left
            for(int i = n/2-layer, j = n/2-layer; i <= n/2+layer; ++i) {
                pattern[i][j] = cur_color;
            }
            // Upper right -> Lower right
            for(int i = n/2-layer, j = n/2+layer; i <= n/2+layer; ++i) {
                pattern[i][j] = cur_color;
            }
        }
        // Corner case
        if(1 < n) {
            pattern[0][0]     = ' ';
            pattern[0][n-1]   = ' ';
            pattern[n-1][n-1] = ' ';
            pattern[n-1][0]   = ' ';
        }
        for(int i = 0; i < n; ++i) {
            printf("%s\n", pattern[i]);
        }
        // Line break between two baskets
        printf("\n");
    }
    return 0;
}

编辑于 2024-03-06 09:17:42 回复(0)
#include<cstdio>
#include<iostream>
using namespace std;
int main() {
	char arr[100][100];
	int h;
	char ar[2];
	while(scanf("%d %c %c", &h, &ar[0], &ar[1])!=EOF){
		//scanf("%d %c %c", &h, &ar[0], &ar[1]);
		if (((h - 1) / 2) % 2){
			char a = ar[0];
			ar[0] = ar[1];
			ar[1] = a;
		}
		for (int i = (h - 1) / 2, j = i; i >= 0 && i <= h - 1; i--, j++) {
			if (i == j) {
				arr[i][i] = ar[i % 2];
			}
			else {
				for (int k = i; k < h; k++) {
					arr[i][k] = ar[i % 2];
					arr[k][i] = ar[i % 2];
				}
				for (int k = j; k >= 0; k--) {
					arr[j][k] = ar[j % 2];
					arr[k][j] = ar[j % 2];
				}
			}
		}
		if (h > 1) {
			arr[0][0] = ' ';
			arr[0][h - 1] = ' ';
			arr[h - 1][0] = ' ';
			arr[h - 1][h - 1] = ' ';
		}
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < h; j++) {
				printf("%c", arr[i][j]);
			}
			printf("\n");
		}
		printf("\n");
	}
	
	return 0;
}

编辑于 2024-03-03 18:49:59 回复(0)
#include<iostream>
#include<stdio.h>

using namespace std;

void func(int n, int inner,int outter)//外层数量 内层字母 外层
{
    char str[80][80] = {0};
    int center = n / 2;//中心点坐标
    int edge = 1;//每一层加2
    int x, y;
    int color = inner;
    for(x = center, y = center ; edge <= n; edge = edge + 2 , x--, y--)
    {
        //left -> right
        for(int i = x , j = y ; i < x + edge ; i++)
        {
            str[i][j] = color;
        }

         //left up -> left down
        for(int i = x , j = y ; j < y + edge ; j++)
        {
            str[i][j] = color;
        }

         //right up -> right down
        for(int i = x , j = y + edge - 1; i < x + edge ; i++)
        {
            str[i][j] = color;
        }

         //left down-> right down
        for(int i = x + edge - 1, j = y ; j < y + edge ; j++)
        {
            str[i][j] = color;
        }

        if(color == inner)//改变花色
        {
            color = outter;
        }
        else
        {
            color = inner;
        }
    }

    if(n != 1)
    {
        str[0][0] = ' ';
        str[0][n - 1] = ' ';
        str[n -1][0] = ' ';
        str[n -1][n -1] = ' ';
    }

    for(int i = 0; i < n; i++)
    {
        printf("%s\n", str[i]);
    }
}

int main()
{  
    int n;
    int inner;
    int outter;

    while((scanf("%d %s %s",&n, &inner, &outter)) != EOF)
    {
        func(n, inner ,outter);
        printf("\n");
    }
    return 0;
}

编辑于 2024-01-29 12:37:50 回复(0)
#include <cstdio>

#define N 80
char res[N][N] = {0};

int main() {
    int n;
    int flag = 0;
    char inCh, outCh;
    while (scanf("%d %c %c", &n, &inCh, &outCh) != EOF) {

        //%d %f %o 忽略空白字符 
        //%c可以读空格换行 前边加一个空格 可以忽略很多空格
        if (flag) {
            printf("\n");
        }
        flag = 1;
        int center = (n + 1) / 2 - 1;
        int count = 1;
        for (int length = 1,x = center,y = center; length <= n; length = length + 2,--x,--y) {
            for (int i = x; i < x + length ; i++) {
                res[x][i] = count == 1 ? inCh : outCh;//上左到上右
                res[x + length-1][i] = count == 1 ? inCh : outCh;//下左到下右
                res[i][x] = count == 1 ? inCh : outCh;//上左到下左
                res[i][x + length - 1] = count == 1 ? inCh : outCh;//上右到下右

            }
            count = count == 1 ? 0 : 1;
        }

        if (n > 1) {
            res[0][0] = res[0][n - 1] = res[n - 1][0] = res[n - 1][n - 1] = ' ';
        }
        for (int x = 0; x < n; x++) {
            printf("%s\n", res[x]);

        }
        /*
          1,3 5 ...N

          55 55 55 55
          44 46 64 66    
          33 37 73 77

        */

    }


}
发表于 2023-03-03 12:13:51 回复(0)
#include<stdio.h>
int main(){
    //二维数组打印图案
    int n;
    char inner,outter;
    while(scanf("%d %c %c",&n,&inner,&outter)!=EOF){
        char kuang[80][80]={0};
        int lenth=0;
        //中心坐标为 (n/2,n/2),长度为0
        //每向外一层 坐标-1,长度+2
        char color=outter;
        for(int i=n/2;i>=0;i--){
            if(color==inner){
                color=outter;
            }
            else{
                color=inner;
            }
            kuang[i][i]=color;
            for(int j=i;j<=i+lenth;j++){
                kuang[i][j]=color;
            }
            for(int j=i;j<=i+lenth;j++){
                kuang[j][i]=color;
            }
            for(int j=i;j<=i+lenth;j++){
                kuang[i+lenth][j]=color;
            }
            for(int j=i;j<=i+lenth;j++){
                kuang[j][i+lenth]=color;
            }
            lenth=lenth+2;
        }
        //磨掉四个角
        if(n>1){
            kuang[0][0]=kuang[0][n-1]=kuang[n-1][0]=kuang[n-1][n-1]=' ';
        }
        //打印
        for(int i=0;i<n;i++){
            printf("%s\n",kuang[i]);
        }
        printf("\n");
    }
}
//输入描述:输入是一个个的三元组,分别是,外筐尺寸n(n为满足1≤n≤79的奇整数),中心花色字符,外筐花色字符,输入数据有多组。
//输出描述:输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
发表于 2023-02-26 18:26:54 回复(0)
#include <cstdio> int main() { int n;  char a,b;  bool firstCase=true;  while(scanf("%d %c %c", &n, &a, &b)!=EOF){ if(firstCase== true){
            firstCase=false;  }else{
            printf("\n");  } char matrix[n][n];  char c;  for(int i=0; i<=n/2;i++){ int j=n-i-1;  int length=n-2*i;  char c;  if((n/2-i)%2==0){
                c=a;  }else{
                c=b;  } for(int k=0;k<length;k++){
                matrix[i][i+k]=c;  matrix[i+k][i]=c;  matrix[j][j-k]=c;  matrix[j-k][j]=c;  }
        } if(n!=1){
            matrix[0][0]=' ';  matrix[0][n-1]=' ';  matrix[n-1][0]=' ';  matrix[n-1][n-1]=' ';  } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){
                printf("%c",matrix[i][j]);  }
            printf("\n");  }
    } return 0; }
发表于 2023-02-20 10:08:04 回复(0)
//同样是从外圈向内圈逐步构造缓冲数组的思想,在本地编译器可实现题目要求但在线提交时代码超时,暂时未知问题出在哪里。
#include<stdio.h>
int main() {
	int n;	//外框尺寸
	char a, b;	//a:中心花色字符,b:外框花色字符
	while (scanf("%d %c %c", &n, &a, &b)) {
		char grid[n][n];
		int x = 0, y = 0;
		for (int i = 0; i <= n / 2; i++) {	//i:圈数
			//从左到右
			for (; y < n - i; y++) {
				grid[x][y] = ((i + n / 2) % 2 == 0) ? b : a;
			}
			//从上到下
			for (; x < n - i; x++) {
				grid[x][y] = ((i + n / 2) % 2 == 0) ? b : a;
			}
			//从右到左
			for (; y >= i; y--) {
				grid[x][y] = ((i + n / 2) % 2 == 0) ? b : a;
			}
			//从下到上
			for (; x >= i; x--) {
				grid[x][y] = ((i + n / 2) % 2 == 0) ? b : a;
			}
			x++;
			y++;
		}
		if (n % 2 == 1) grid[n / 2][n / 2] = a;
		grid[0][0] = grid[0][n - 1] = grid[n - 1][0] = grid[n - 1][n - 1] = ' ';
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				printf("%c", grid[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}


发表于 2023-02-02 22:36:11 回复(0)
#include<iostream>
#include<stdio.h>
#define MAXSIZE 80
char ans[MAXSIZE][MAXSIZE];

void draw(int s, int e, char c) {
    for (int i = s; i <= e; i++) {
        ans[s][i] = c;
        ans[i][s] = c;
        ans[e][i] = c;
        ans[i][e] = c;
    }

}
void printAns(int n) {
    //对n==1进行特殊处理
    if (n != 1) {
        //去掉四个角度
        ans[0][0] = ' ';
        ans[n - 1][n - 1] = ' ';
        ans[0][n - 1] = ' ';
        ans[n - 1][0] = ' ';
    }

    int i, j;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%c", ans[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int n;
    char in, out;
    bool flag = true;
    while (scanf("%d %c %c", &n, &in, &out) != EOF) {
        //注意题目的陷阱, 最后一组输入是没有换行的, 所以从第二组输入前打印一个换行, 
        if (!flag)
            printf("\n");
        else {
            flag = false;
        }


        char c;
        //s,e分别为绘框的起始与结束范围
        int e = n - 1, s = 0;
        //这里i为计算有多少个框叠在一起
        for (int i = (n + 1) / 2; i > 0; i--) {
            //第奇数个框绘制中心字符, 偶数个框绘制外框字符
            if (i % 2 == 0)
                c = out;
            else
                c = in;

            draw(s, e, c);
            
            s++;
            e--;
        }


        printAns(n);

    }
}
发表于 2023-01-19 18:53:24 回复(0)
格式有问题,第一个图案打印前不换行,后面其他图案 打印前都要换行 离谱

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <cstdio>
#include <string>
#include <iostream>
#define max_size 100
using namespace std;

char arr[max_size][max_size] = { '\0' };
void swapchar(char& a, char& b) {
    char temp = a;
    a = b;
    b = temp;
}
void right(int& i, int& j, char* arr, int count, char a) {
    for (int k = 0; k < count * 2; k++) { *(arr + i * max_size + j) = a; j++; }
}
void down(int& i, int& j, char* arr, int count, char a) {
    for (int k = 0; k < count * 2; k++) { *(arr + i * max_size + j) = a; i++; }
}
void left(int& i, int& j, char* arr, int count, char a) {
    for (int k = 0; k < count * 2; k++) { *(arr + i * max_size + j) = a; j--; }
}
void up(int& i, int& j, char* arr, int count, char a) {
    for (int k = 0; k < count * 2; k++) { *(arr + i * max_size + j) = a; i--; }
}
int main() {
    //每次从中心开始,一开始初始化为\0
    char a, b;
    int n;
    int i, j;
    int count;
    int flag = 0;
    while (scanf("%d %c %c", &n, &a, &b) != EOF) {

        if (n == 1) {
            printf("%c\n", a);
            continue;
        }
        if (n >= 2) {
            printf("\n");
        }
        i = j = n / 2;
        count = 0;//count代表圈数
        arr[i][j] = a;
        swapchar(a, b); count++;
        i--; j--;
        while (count != n / 2+1) {
            right(i, j, *arr, count, a);
            down(i, j, *arr, count, a);
            left(i, j, *arr, count, a);
            up(i, j, *arr, count, a);
            count++;
            swapchar(a, b);
            i--; j--;

        }//圈还没走完的时候

        arr[0][0] = ' ';
        arr[0][n - 1] = ' ';
        arr[n - 1][n - 1] = ' ';
        arr[n - 1][0] = ' ';
        for (int k = 0; k < n; k++) {
            cout << arr[k] << endl;
            for (int l = 0; l < n; l++) {
                arr[k][l] = '\0';
            }
        }
        //if (flag) {
        //    printf("\n");
        //}
        //else {
        //    flag = true;
        //}
        //for (int k = 0; k < n; k++) {
        //    for (int l = 0; l < n; l++) {
        //        arr[k][l] = '\0';
        //    }
        //}
        

    }


}

发表于 2023-01-10 03:31:09 回复(0)
#### 简要分析
这个题目感觉挺难的,这里记录一下王道考研的求解方法。首先该排版题目有一个显著特性:不同与上面那道例题,该图形并不具有很强的规律性,特别是该规律(同一圈的字符相同且相邻圈交替)并不与输出顺序(从上到下、从左到右)一致。于是采用了另一种常用的方法:先利用数组完成排版,再进行输出。

利用一个缓存数组来表示将要输出的字符阵列,我们对该字符阵列的坐标做如下规定,规定阵列左上角字符坐标为(1,1),阵列右下角字符坐标为(n,n),其它坐标可以通过这个推理。按照内圈到外圈的顺序来完成图形的排列,在完成每圈排列时,我们需要注意两个要点:首先需要确定该圈左上角的坐标。我们将以这个坐标为参照点来完成该圈的其他字符位置的确定。观察图形得知,最中间圈的左上角字符坐标位置为(n/2+1,n/2+1),次中间圈的左上角字符坐标为(n/2+1-1,n/2+1-1),依次类推即可得到图形中每一个圈的参照点。其次,我们需要计算该圈每边边长长度。这也较为容易,中间圈长度长度为1,次中间圈长度为3,依次类推,外圈总比内圈长度增加2.
#### C++代码

```
#include<iostream>
using namespace std;
int outPutBuf[82][82]; //用于预排版的输出缓存

int main() {
    char a,b; //输入两个字符
    int n; //叠框大小
    bool firstCase=true; //是否为第一组数据标志,初始值为true
    while(scanf("%d %c %c",&n,&a,&b)==3) {
        if(firstCase==true) {
            firstCase=false;
        }
        else printf("\n"); //这个是完成每个叠框之间有一个空格
        for(int i=1,j=1;i<=n;i+=2,j++) { //i用来遍历每圈的圈长度,j用来记录圈数
            int x=n/2+1,y=n/2+1;
            x-=j-1;y-=j-1; //计算每个圈左上角点的坐标
            char c=j%2==1 ? a : b; //计算当前圈要使用那个字符
            for(int k=1;k<=i;k++) { //对当前圈进行赋值
                outPutBuf[x+k-1][y]=c; 
                outPutBuf[x][y+k-1]=c; 
                outPutBuf[x+i-1][y+k-1]=c; 
                outPutBuf[x+k-1][y+i-1]=c; 
            }
        }
        if(n!=1) {
            outPutBuf[1][1]=' ';
            outPutBuf[n][1]=' ';
            outPutBuf[1][n]=' ';
            outPutBuf[n][n]=' '; //将四角置为空格
        }
        for(int i=1;i<=n;i++) {
            for(int j=1;j<=n;j++) {
                printf("%c",outPutBuf[i][j]);
            }
             printf("\n");
        }
    }
    return 0;
}
```
发表于 2022-04-01 20:26:54 回复(0)
#include<iostream>
#include<cstdio>

using namespace std;
char matrix[101][101];

int main(){

    int n;
    char c1, c2;
    bool flag = true; //判断是否为第一次输入
    while(scanf("%d %c %c", &n,&c1,&c2) != EOF){
        if(flag) flag = false;
        else printf("\n");

        //确定左上、右下坐标  i,j     n=11
        for(int i=0; i <= n/2; i++){   //i=0
            int j = n - i -1;  //j=10

            int size = n - 2*i; //size = 11
            
            //!!!!!!!!!1
            char c;
            if(i%2 == 0)c=c2;   // n/2 - i = 5   i=0
            else c=c1;

            //填充数组
            for(int k = 0; k< size; k++){   // k: [0,10]
                matrix[i+k][i] = c;
                matrix[i][i+k] = c;
                matrix[j][j-k] = c;
                matrix[j-k][j] = c;
            }
        }

        //打印 : 剔除4个角以后再打印 如果n=1那么不需要剔除
        if(n != 1){
            matrix[0][0] = ' ';
            matrix[0][n-1] = ' ';
            matrix[n-1][0] = ' ';
            matrix[n-1][n-1] = ' ';
        }

        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                printf("%c", matrix[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}

#include<iostream>
#include<cstdio>

using namespace std;
char matrix[101][101];

int main(){

    int n;
    char c1, c2;
    bool flag = true; //判断是否为第一次输入
    while(scanf("%d %c %c", &n,&c1,&c2) != EOF){
        if(flag) flag = false;
        else printf("\n");

        //确定左上、右下坐标  i,j     n=11
        for(int i=0; i <= n/2; i++){   //i=0
            int j = n - i -1;  //j=10

            int size = n - 2*i; //size = 11
            // ?????
            char c;
            if((n/2-i)%2 == 0)c=c1;   // n/2 - i = 5   i=0
            else c=c2;

            //填充数组
            for(int k = 0; k< size; k++){   // k: [0,10]
                matrix[i+k][i] = c;
                matrix[i][i+k] = c;
                matrix[j][j-k] = c;
                matrix[j-k][j] = c;
            }
        }

        //打印 : 剔除4个角以后再打印 如果n=1那么不需要剔除
        if(n != 1){
            matrix[0][0] = ' ';
            matrix[0][n-1] = ' ';
            matrix[n-1][0] = ' ';
            matrix[n-1][n-1] = ' ';
        }

        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                printf("%c", matrix[i][j]);
            }
            printf("\n");
        }
    }
    return 0;
}
请问22~24行,为什么用i判断字符就是错的, 必须要用n/2 - i  ?
发表于 2021-06-15 13:44:21 回复(0)

问题信息

难度:
34条回答 9424浏览

热门推荐

通过挑战的用户

查看代码
叠筐