首页 > 试题广场 >

拍照队形

[编程题]拍照队形
  • 热度指数:6764 时间限制: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
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)
/*
 解题思路:
 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)
这就是一个找规律的题目,没啥可说的,注意读入的字符串有可能存在空格就是了,我一开始为了方便(其实也就少写一行代码),用的next()读入的字符串,但因为有空格数据无法完全读入,所以就报数组越界了。
不知道是不是因为频繁调用print,最后耗时比较多。
import java.util.Scanner;

/**
 * @Date: 2020-05-03 10:23
 * @version: 1.0
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.nextLine();
        char[] chs = sc.nextLine().toCharArray();
        int k = (N-1)/3;//上下高度
        for (int i=0;i<2*k;i=i+2){
            for (int j=1;j<=i/2;j++)//上半部分左边空格数
                System.out.print(" ");
            System.out.print(chs[i]);//上半部分第一个数据
            for (int j=1;j<=2*k-1-i;j++)//上半部分中间空格数
                System.out.print(" ");
            System.out.println(chs[i+1]);//上半部分第二个数据
        }
        for (int i=2*k;i<N;i++){
            for (int j=1;j<=k;j++)//下半部分右侧空格数
                System.out.print(" ");
            System.out.println(chs[i]);//下半部分数据
        }
        sc.close();
    }
}


发表于 2020-05-03 11:19:12 回复(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)
估计我的方法是最笨的了

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)
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)
/*
* 这个题我是这么想的
* 要想组成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)