首页 > 试题广场 >

拍照队形

[编程题]拍照队形
  • 热度指数:6692 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
猿辅导公司的 N位(N>=4)研发同学组织了一次秋游活动,某同学带了个无人机在高空拍照,活动结束时,先拍了一张所有同学排成公司猴头Logo的照片, 接着有人提议再排成“猿”的首字母Y字形来拍一张合照。

用字符串中的每一个字符(不是换行符或结束符'\0')代表一位老师,输出排好后的队形。要求 Y字除去中心点外,上下半部分等高,按照从左到右,从上到下进行排序。队形中没人的部分用空格占位。
输入数据保证可以排出一个完整的Y字,即长度为 3k+1 (k>=1)

例如: 7个 x ,排成队形为(为了方便说明,这里用‘-’代替空格):
x---x
-x-x
--x
--x
--x

// 参考程序
#include <cstring>
#include <iostream>
#include <cstdio>
using namespace std;
char str[1010];
int N;
int main(){
    scanf("%d\n", &N);
    // TODO: 读入字符串,注意可能含空格

    // TODO: 输出拍照队形,没人用空格占位
    printf(" %c\n", str[0]);
}


输入描述:
输入数据有两行,第一行输入N(N<=1000),表示字符串长度。
第二行输入字符串。


输出描述:
用字符串表示的排好的队形,没人处用空格(' ')占位,行尾不能有多余字符,即每行最后一个字符(除了换行符以外),为字符串中代表该老师的字符。
示例1

输入

4
a3f/

输出

a 3
 f
 /
示例2

输入

7
abcdefg

输出

a   b
 c d
  e
  f
  g
示例3

输入

10
iiiiiiiiii

输出

i     i
 i   i
  i i
   i
   i
   i
   i
N = int(input())
a = input()
# 前一半行数
k = int((N-1)/3)
for i in range(k):
    b = ""
    b = b + ' '*i + a[2*i] + ' '*(2*(k - i) - 1) + a[2*i + 1]
    print(b)
for i in range(2*k, 3*k + 1):
    b = ""
    b = b + ' ' * k + a[i]
    print(b)

发表于 2020-05-01 11:43:34 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main{
    public static void main(String[] args) throws IOException{
        Scanner sc=new Scanner(System.in);
        int num=sc.nextInt();
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        String str=reader.readLine();
        char[] ch=str.toCharArray();
        int t1=(2*num+1)/3-1,t2=(num+2)/3-1,k=0,t3=t1;
        for(int i=0;i<=t2;i++) {
            //打印前面的空格
            for(int n=0;n<i;n++) System.out.print(" ");
            //打印数字
            for(int j=i;j<=t1;j++) {
                if(i==j || i+j==2*t2)
                System.out.print(ch[k++]);
                else System.out.print(" ");
            }
            System.out.println();
            t1--;
        }
        //打印下面的数字
        for(int i=t2;i<t3;i++) {
            //打印前面的空格
            for(int j=0;j<t2;j++) {
                System.out.print(" ");
            }
            System.out.println(ch[k++]);
        }
    }
}
用字符流来读取字符串,解决读入空格报错的问题,但是牛客网的环境不允许这样做,所以编译会报错,但是本地不会报错。额,没法了。
编辑于 2019-09-10 21:57:52 回复(0)
/*
* 这个题我是这么想的
* 要想组成Y,输入的数必须符合3k+1 (k>=1)
* 下面咱们总结一下,假设用户输入的为num变量,简化用户输入的都为i,空格用-代替
* 所以当num=4的时候,也就是k=1。
* 是这样的
*    i-i
*     i
* 当num=7的时候,也就是k=2。
* i---i
* -i-i
* --i
* --i
* --i
* 当num=10的时候,也就是k=3。
* i-----i
* -i---i
* --i-i
* ---i
* ---i
* ---i
* ---i
* 等等
* 我们可以从这三个就可以看出,大家注意其实可以从单行一个字母把Y分为两个部分
* 比如k=1时,可以把1-1行Y分为上半部分
* 比如k=2时,可以把1-2行Y分为上半部分
* 比如k=3时,可以把1-3行Y分为上半部分
* 所以发现特点没,k的值就是标志Y的两个部分的分界线
* 然后我们要做的就是分两个部分进行打印,上半部分(行数=k)和下半部分(行数=k+1)
* 我们首先看上半部分:
* 上半部分的输出其实就是首先是每一行的第一个i前面输出a个空格,再输出i,然后中间去输出b个空格,再输出i
* 关键就是我们去确定a和b
* 大家可以看上面的找出规律,每一行每一行的第一个i前面输出a个空格的,a=i(i从0开始)
* 中间去输出b个空格,这个b=2*(k-i)-1(i为当前每行的行数,从0开始)
* 然后就照着这个进行循环打印上半部分
* 下半部分简单
* 直接就是打印每一行的第一个i前面输出a个空格,这个a=k
* 然后就结束了,下面是代码具体实现
*/
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //用户输入的数
        int num = sc.nextInt();
        if (num < 4 || (num - 1) % 3 != 0)
            return;
        //计算出k
        int k = (num - 1) / 3;
        char[] nums = new char[num];
        for (int i = 0; i < num; i++) {
            String str = sc.next();
            nums[i] = str.toCharArray()[0];
        }
        //进行打印上半部分
        int j = 0;
        for (int i = 0; i < k; i++) {
        //打印第i行的第一个字符前面的空格,空格数就为k-1也就是i
            int temp = i;
            while (temp > 0) {
                System.out.print(" ");
                temp--;
            }
            //打印第i行的第一个字符
            System.out.print(nums[j]);
            j++;
            //打印第i行的中间的空格
            temp = 2 * (k - i) - 1;
            while (temp > 0) {
                System.out.print(" ");
                temp--;
            }
            //打印第i行的最后一个字符
            System.out.print(nums[j]);
            j++;
            System.out.println();
        }
        //进行打印下半部分
        for (int i = 0; i < k + 1; i++) {
            int temp = k;
            while (temp > 0) {
                System.out.print(" ");
                temp--;
            }
            System.out.print(nums[j]);
            j++;
            System.out.println();
        }
    }



编辑于 2020-04-20 23:59:10 回复(2)
public class Demo {
    public static void main(String[] args) {
        System.out.println("请输入字符串:");
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine().replace(" ", "");
        if(s.length()%3!=1) {
            System.out.println("输入有误,程序退出...");
            System.exit(0);
        }
        int half=s.length()/3;
        int row = half*2+1;
        for(int i=0;i<row;i++){
            if(i<half){
                for(int j=1;j<=i;j++){
                    System.out.print(" ");
                }
                System.out.print(s.charAt(2*i));
                for(int j=1;j<=2*(half-i)-1;j++){
                    System.out.print(" ");
                }
                System.out.println(s.charAt(2*i+1));
            }else{
                for(int j=1;j<=half;j++){
                    System.out.print(" ");
                }
                System.out.println(s.charAt(i+half));
            }
        }
    }
}
 

编辑于 2019-01-03 14:08:13 回复(0)
/*
根据上下等高,我们可以发现规律
设等高为n,字符串长度为k
有 2n + n +1 = k
他的最长的字符串长度为 k - n,
以此为:k-n,k-n-1,..k-n-n-1,后面就是等长k-2n
*/
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        //int n = input.nextInt();修改前
        //String str = input.next();修改前
               int n = Integer.parseInt(input.nextLine());//修改后
        String str = input.nextLine();//修改后
        char[] ch = str.toCharArray();

        //定义并计算相关变量
        int k = 0;
        int high = (n - 1)/3;//上下的高度
        int maxlength = n - high;//最长的字符串长度
        int cishu = high*2+1;//循环的次数
        for(int i = 0;i<cishu;i++){
            if(i<high){
                for(int j = 0;j<maxlength-i;j++){
                    if(j==i||j==maxlength-i-1){
                        System.out.print(ch[k++]);
                    }else{
                        System.out.print(" ");
                    }
                }
            }else{
                for(int j = 0;j<n-2*high;j++){
                    if(j == n-2*high-1){
                        System.out.print(ch[k++]);
                    }else{
                        System.out.print(" ");
                    }
                }
            }
            if(i!=cishu-1)
                System.out.println();
        }
    }
}

修改前只有80%,修改后AC
编辑于 2020-05-03 15:38:51 回复(2)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

//总结目前牛客问题 第一,没有循环输入问题, 第二 有循环输入问题, 第三 输入有多余空格问题 ,第四 中间插入多余空行问题 ....
namespace Test0001
{
    class Program
    {
        public static void Main(string[] args)
        {
            //string line;
            //while (!string.IsNullOrEmpty(line = Console.ReadLine())) Func(line);
            Func(Console.ReadLine());
        }
        public static void Func(string line)
        {
            int n = int.Parse( line.Trim());
            string str = Console.ReadLine();
            int m = (n - 1) / 3, top = m, index = 0;
            //上半部分 m 排(2*m)个字符 组成 v 
            //第一层 1+2*m 第二层 1+2*(m-1)
            string s = "";
            while (top!=0)
            {
                Console.WriteLine(s + str[index++].ToString().PadRight(2 * (top--), ' ') + str[index++]);
                s += " ";
            }
            //下半部分 m+1 排(m+1)个字符 组成  l
            top = m + 1;
            while (top--!=0)
            {
                Console.WriteLine(s + str[index++]);
            }
           
        }
    }
}
分成上下两个部分来做比较简单.
先计算出上下层数m 然后上部分加上下部分即可
s="";
上半部有规律, 第一层长度为 (1+2*m) 字符在首尾 并且中间全部是空格   s+=" ";
第二层  s(1个空格) + 2个字符在首尾中间空格长度(1+2*(m-1))      s+=" ";
第三层  s(2个空格) + 2个字符在首尾中间空格长度(1+2*(m-2))      s+="  ";
......
下半部分加上中间 m+1层
每一层都是 s个空格加上字符


发表于 2019-12-10 19:30:57 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    string str;
    cin>>n;
    cin.ignore();
    getline(cin,str);
    int k=(n-1)/3,index=0;
    //上面部分;
    for(int i=1;i<=k;i++){
        for(int j=1;j<i;j++)
            cout.put(' ');
        cout<<str[index++];
        for(int j=1;j<=2*k-2*i+1;j++)
            cout.put(' ');
        cout<<str[index++]<<endl;
    }
    //中间以及下面部分;
    string temp(k,' ');
    for(int i=1;i<=k+1;i++)
        cout<<temp<<str[index++]<<endl;
    return 0;
}

发表于 2019-12-03 14:19:18 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n,k,m,t=0;
    cin>>n;
    string s;
    getchar();
    getline(cin,s);
    k = (n-1)/3;
    m = 2*k+1;
    for(int i=0;i<k;i++){
        for(int j=0;j<i;j++)
            cout<<" ";
        cout<<s[t++];
        for(int j=0;j<m-2*(i+1);j++)
            cout<<" ";
        cout<<s[t++]<<endl;
    }
    for(int i=k;i<m;i++){
        for(int j=0;j<k;j++)
            cout<<" ";
        cout<<s[t++]<<endl;
    }
    return 0;
}

发表于 2019-11-19 10:38:39 回复(0)
求助,为啥我的用列只能通过80% 啊 真的绝望了 查不出来。。。。。。。
importjava.util.Scanner;
 
publicclassMain {
publicstaticvoidmain(String[] args) {
test1();   
}
 
privatestaticvoidtest1() {
    Scanner scanner = newScanner(System.in);
    intpeople = scanner.nextInt();
    String x1=scanner.next();
    //int length = people1.length();
    char[] arr=x1.toCharArray();
    //String[] arr = new String[people];
     
    //int people = scanner.nextInt();
    //int people=arr.length;
    if((people-1)%3!=0){
        System.out.println("输入不合法 请输入3K+1的数"); 
         
    }
    /*for (int i = 0; i < arr.length; i++) {
        arr[i]=scanner.next();
    }*/
     
    intk=(people-1)/3;
    introw=2*k+1;
    intz=0;
    intm=row;
    intal=arr.length-1;
    for(inti = 0; i < k+1; i++) {
        for(intj = 0; j < i; j++) {
            System.out.print(" ");
        }
        for(intj = 0; j < row-(2*i); j++) {
            if(j==row-(2*i)-1||j==0){
                if(j==0){
                    charx=arr[z];
                    z++;
                    System.out.print(x);
                }else{
                    charx=arr[z];
                z++;
                    System.out.print(x);
                }
                if(z>al){
                    break;
                }
                 
            }else{
                System.out.print(" ");
            }      
        }      
        System.out.println();
    }
    for(inti = 0; i < k; i++) {
        for(intj = 0; j < k; j++) {
            System.out.print(" ");
        }
        for(intj = 0; j <1; j++) {
            charx=arr[z];
            z++;
                System.out.print(x);
            if(z>al){
                break;
            }
        }
        System.out.println();
    }
     
}
 
}
发表于 2019-08-21 18:05:04 回复(1)
n = int(input())
ch = list(input())

up = (n-1)//3
pre = 0
mid = 2 * up - 1
p = 0
for i in range(up):
    temp = " " * pre + ch[p] + " " * mid + ch[p+1]
    pre += 1
    p += 2
    mid -= 2
    print(temp)
for i in ch[p:]:
    temp = pre * " " + i
    print(temp)

发表于 2019-08-02 21:04:10 回复(0)
估计我的方法是最笨的了

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner cscanner = new Scanner(System.in);
        int count = cscanner.nextInt();
        if((count-1)%3!=0){
            System.out.println("数量不满足3n+1!");
            return;
        }
        Scanner lscanner = new Scanner(System.in);
        String line = lscanner.nextLine();
        char[] member = line.toCharArray();
        if(count!=member.length){
            System.out.println("成员数量和具体成员数量不相符!");
            return;
        }
        int i = ((count-1)/3);
        int index = 0;
        System.out.print(member[index++]);
        for(int x = 0; x< 2*(i-1)+1; x++){
            System.out.print(" ");
        }
        System.out.println(member[index++]);
        
        int spaceIndex = 1;
        if(i>1){
            for(int b = i-1;b>0;b--){
                int a = 2*(b-1)+1;
                for(int j = 0;j< spaceIndex;j++){
                    System.out.print(" ");
                }
                spaceIndex++;
                System.out.print(member[index++]);
                for(int f = 0;f < a ;f++){
                    System.out.print(" ");
                }
                System.out.println(member[index++]);
                
            }
        }
        int ver = count-(2*i);
        for(int t = 0;t < ver ;t++){
            for(int q = 0;q<i;q++){
                System.out.print(" ");
            }
            System.out.println(member[index++]);
        }
        
        
    }
}
发表于 2019-07-31 19:04:48 回复(0)
/*
格式化输出
*/
#include<bits/stdc++.h>
using namespace std;
#define N 10000

int main()
{
//    freopen("input.txt", "r", stdin);
    int k, n, t = 0;
    cin >> n;
    char s[n];
    gets(s);
    gets(s);//20%数据输入有空格
    k = (n - 1) / 3;
    for(int i = 0; i < k; i++) {
        for(int j = 0; j < i; j++) cout << " ";
        cout << s[t++];
        for(int j = 0; j < 2 * (k - i) - 1; j++) cout << " ";
        cout << s[t++] << endl;
    }
    for(int i = k; i < 2 * k + 1; i++) {
        for(int j = 0; j < k; j++) cout << " ";
        cout << s[t++] << endl;
    }
    return 0;
}

发表于 2019-07-12 14:01:11 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = Integer.parseInt(scanner.nextLine());
        char[] chs = scanner.nextLine().toCharArray();
        int k = (n - 1) / 3;
        int area = 2 * k + 1;
        int index = 0;
        for (int i = 0; i < area; i++) {
            if (i < k) {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < area - i; j++) {
                    char c = (j == i || j == area - i - 1) ? chs[index++] : ' ';
                    sb.append(c);
                }
                System.out.println(sb.toString());
            } else {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j <= k; j++) {
                    char c = (j == k) ? chs[index++] : ' ';
                    sb.append(c);
                }
                System.out.println(sb.toString());
            }
        }
    }
}
编辑于 2019-07-07 16:19:59 回复(0)
m = int(input())
s = input()
s_len = len(s)
line_n_2 = (s_len-1)//3
row = (2*s_len+1)//3
k = 0
res = []
for i in range(row):
    if i < line_n_2:
        tmp = ' '*i + s[k] + ' '*(row-2*i-2) + s[k+1] + ' '*i
        # print(i, tmp, len(tmp), 2)
        k += 2
    else:
        tmp = ' '*line_n_2 + s[k] + ' '*line_n_2
        k += 1
    res.append(tmp)
for line in res:
    print(line)
您的代码已保存
格式错误:您的程序输出的格式不符合要求(比如空格和换行与要求不一致)
case通过率为90.00%
有大神知道哪里出的问题吗
发表于 2019-02-26 10:13:07 回复(3)
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    char str[1010];
    char temp;
    int Num;
    //string str;
    cin >> Num;//字符数量 (3×i)+1
    for(int i = 0;i < Num;++i){
        cin >> temp;
        cin >> noskipws;
            str[i] = temp;
    }
    int high = (Num-1)/3;//计算出Y上面每一行包括两个元素的行数
    for(int i = 0;i < high;++i)//打印Y的上面
    {
        for(int j = 0;j < i;++j)
        {
            cout << " ";
        }
        cout << str[(2*i)];
        for(int k = 2*(high-i)-1;k>0;k--)
        {
            cout << " ";
        }
        cout << str[(2*i)+1];
        cout << endl;
    }  
    for(int i = 0;i < high+1;++i)
    {
        for(int j = 0;j < high;++j)
        {
            cout << " ";
        }
        cout << str[(2*high+i)];
        cout << endl;
    }
    return 0;
}
编辑于 2019-01-07 12:55:50 回复(0)
n = int(input())
str0 = input()
li = []
for i in range(len(str0)):
    li.append(str0[i])
k = int((n-1)/3)
for i in range(k):
    for j in range(i):
        print(' ',end='')
    print(li[2*i],end = '')
    for j in range(i+1,2*k-i):
        print(' ',end = '')
    print(li[2*i+1])
for i in range(k+1):
        print(' '*k,end = '')
        print(li[2*k+i])

编辑于 2019-01-03 20:29:47 回复(0)
/*
 解题思路:
 1、输入
 输入数字theK和字符串str,因为允许输入空格,所以使用nextLine()来接收str;
 
 2、输出
 分为上下2部分打印Y型队列:
 (1)上半部分
 每行包括4部分内容(前面的空格 + 第一个字符 + 中间的空格 + 后一个字符),
 上半部分的行数为theK,
每行前半部分的空格数为i,
每行中间空格数为 z = 2 * theK -1(每下移1行,总数减少2,即z=z-2),
通过charArray[count++]来控制依次输出每个字符。
 (2)下半部分
每行包括2部分内容(前面的空格 + 字符),
每行前面的空格数为theK+1,
通过charArray[count++]来控制依次输出每个字符。
 **/
package niuKeWang;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class 拍照队形 {
	
	public static void printY(){
		Scanner sc = new Scanner(System.in);
		int theN = Integer.parseInt(sc.nextLine());
		String str = sc.nextLine();
		char[] charArray = str.toCharArray();
		sc.close();
		int theK = (theN - 1) / 3;
		int count = 0;
		int z = 2 * theK -1;
		
		//打印Y的上半部分
		for(int i = 0; i < theK; i++ ){
			//输出每行前半部分的空格
			for(int j = 0; j < i; j++){
				System.out.print(" ");
			}
			//输出每行前面的字符
			System.out.print(charArray[count++]);
			//输出每行中间的空格
			for(int k = 0; k < z; k++){
				System.out.print(" ");
			}
			z = z - 2;
			//输出每行后面的字符
			System.out.print(charArray[count++]);
			//输出换行符
			System.out.println();
		}
		
		
		//打印Y的下半部分
		for(int m = 0; m < theK+1; m++){
			//输出每行前半部分的空格
			for(int a = 0; a < theK; a++){
				System.out.print(" ");
			}
			//输出没行的字符
			System.out.print(charArray[count++]);
			//输出换行符
			System.out.println();
		}
		
	}


	public static void main(String[] args) {
		printY();
	}
	
	
}




编辑于 2020-07-21 14:33:09 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        input.nextLine();
        String string = input.nextLine();
        int number = (n-1)/3;
        int high = number*2+1;
        int index = 0;
        for(int i=0;i<number;i++) {
            for(int j=0;j<i;j++)
                System.out.printf(" ");
            System.out.printf("%c",string.charAt(index++));
            for(int j=0;j<(number*2-(i+1)*2 +1);j++)
                System.out.printf(" ");
            System.out.printf("%c",string.charAt(index++));
            System.out.println();
        }
        for(int i=0;i<number+1;i++) {
            for(int j=0;j<number;j++)
                System.out.printf(" ");
            System.out.printf("%c",string.charAt(index++));
            System.out.println();
        }
    }
}
发表于 2021-03-26 10:54:46 回复(0)
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
           int n=sc.nextInt();
            sc.nextLine();
           String str=sc.nextLine();
           solve(str,n);
        }
        sc.close();
    }
    public static void solve(String str,int n) {
		int index=0;
		n=(n-1)/3;
		String s="";
		for(int j=1;j<=2*n-1;j++)
			s=s.concat(" ");
		for(int i=0;i<n;i++) {
			System.out.println(s.substring(0, i)+str.charAt(index++)+s.substring(0,s.length()-2*i)+str.charAt(index++));
		}
		for(int i=0;i<=n;i++) {
			System.out.println(s.substring(0, n)+str.charAt(index++));
		}
	 }
}

发表于 2021-01-21 23:57:01 回复(0)
A了80%,就是分情况讨论 (length-1)/3,之前和之后
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int len = scanner.nextInt();
        String string = scanner.next();
        char [] chars = string.toCharArray();
        int len_2 = (len-1)/3;
 
        List<String> res = new ArrayList<>();
 
        for(int i=0;i<len_2;i++){
            String temp = "";
            for(int j=0;j<i;j++){
                temp += " ";
            }
            temp += chars[i*2];
            int black = (len_2-i)*2-1;
            for(int j=0;j<black;j++){
                temp += " ";
            }
            temp += chars[i*2+1];
            res.add(temp);
        }
 
        for(int i=len_2*2;i< len;i++){
            String temp = "";
            for(int j=0;j<len_2;j++){
                temp += " ";
            }
            temp+=chars[i];
            res.add(temp);
        }
        for(String s : res){
            System.out.println(s);
        }
    }
}


发表于 2020-09-12 21:41:50 回复(0)