输入是一个个的三元组,分别是,外筐尺寸n(n为满足1≤n≤79的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符,输入数据有多组。
输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
11 * + 5 W @
+++++++++ +*********+ +*+++++++*+ +*+*****+*+ +*+*+++*+*+ +*+*+*+*+*+ +*+*+++*+*+ +*+*****+*+ +*+++++++*+ +*********+ +++++++++ @@@ @WWW@ @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 ?