输入是一个个的三元组,分别是,外筐尺寸n(n为满足1≤n≤79的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符,输入数据有多组。
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
11 * + 5 W @
+++++++++ +*********+ +*+++++++*+ +*+*****+*+ +*+*+++*+*+ +*+*+*+*+*+ +*+*+++*+*+ +*+*****+*+ +*+++++++*+ +*********+ +++++++++ WWW W@@@W W@W@W W@@@W WWW
#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;
}
#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; }
第一种代码没有使用逻辑上从外圈到内圈的思想,寻找前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; }
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); } } }
#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; }
过关咯
#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]); } } }
#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; }
#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; }
#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 */ } }
#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; }
#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; }
#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 ?