题目描述
有 n 个团体操队员编号分别为 1∼n 。其队形(分连续队形和梅花桩队形)可以按行排列或者按列排列,按行(列)排列时每行(列)有 r 个位置。
例1:n=16,r=6,连续队形按行排列。
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
例2:n=16,r=3,连续队形按列排列。
1 | 4 | 7 | 10 | 13 | 16 |
---|---|---|---|---|---|
2 | 5 | 8 | 11 | 14 | |
3 | 6 | 9 | 12 | 15 |
例3:n=16,r=7,梅花桩队形按行排列。
1 | 2 | 3 | 4 | |||
---|---|---|---|---|---|---|
5 | 6 | 7 | ||||
8 | 9 | 10 | 11 | |||
12 | 13 | 14 | ||||
15 | 16 |
例4:n=16,r=5,梅花桩队形按列排列。
1 | 6 | 11 | 16 | |||
---|---|---|---|---|---|---|
4 | 9 | 14 | ||||
2 | 7 | 12 | ||||
5 | 10 | 15 | ||||
3 | 8 | 13 |
现请你编写程序指出编号为 m 的团体操队员所处位置的行号和列号。
输入格式
本题有多组数据
第一行只有一个自然数 k ,表明随后的 k 行每行都是一组数据。
接下来 k 行,每行都有五个整数,分别表示队伍里的人数、队形代号(1表示连续队形,而2表示梅花桩队形)、排列方式(1表示按行排列,而2表示按列排列)、每行(列)的位置数、和询问位置的队员的编号
输出格式
输出 2k 个整数,第 i 对整数表示第 i 组询问的行编号和列编号(不用换行)
输入输出样例
输入 #1
2 16 1 1 6 11 16 2 2 5 11
输出 #1
2 5 1 5
解题思路
- 首先还是老样子看一下数据范围来确定我们使用什么算法来解题,但是这道题没有给出数据范围,所以我的思路模拟出它的每一种情况,用二维数组来暴力解题,这道题的正解不是我这样的,但是我这种思路也可过,思路也很清晰,容易理解。
- 题目大意是,给定k组数据每一组数据都有5个数,这里我用的是数组(int arr[] = new int [5])来存放这5个数:
- 第1个数表示队伍里的人数(1~arr[0])
- 第2个数表示队形代号(1表示连续队形,而2表示梅花桩队形)
- 第3个数表示排列方式(1表示按行排列,而2表示按列排列)
- 第4个表示每行(列)的位置数(如果第3个数是1,那么它的每行将有arr[3](第4个数)长)
- 第5个数表示在这个二维数组出现的行和列。
- 根据题意得知将有4中情况(arr[1]:表示队形代号,arr[2]:表示排列方式)。
- (arr[1]==1 , arr[2]==1),二维数组:int array[ ][ ] = new int[arr[0] / arr[3] + 2][arr[3] + 1];
- (arr[1]==1 , arr[2]==2),二维数组:int array[ ][ ] = new int[arr[3] + 1][arr[0] / arr[3] + 2];
- (arr[1]==2 , arr[2]==1),二维数组:int array[ ][ ] = new int[arr[0] / 2 + 2][arr[3] + 1];
- (arr[1]==2 , arr[2]==2),二位数组:int array[ ][ ]= new int[arr[3] + 1][arr[0] / arr[3] * 2 + 2];
代码
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main{
static class Input { // 优化输入
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer in = new StreamTokenizer(is);
public int nextInt() throws IOException {
in.nextToken();
return (int) in.nval;
}
}
// 优化输出
static PrintWriter pr = new PrintWriter(new BufferedOutputStream(System.out));
public static void main(String[] args) throws IOException {
Input in = new Input();
int k = in.nextInt(); // 表示k组数据
for (int i = 0; i < k; i++) {
int arr[] = new int[5];
for (int j = 0; j < arr.length; j++)
arr[j] = in.nextInt();
Print(arr);
}
pr.flush();
}
public static void Print(int arr[]) { // 输出结果
int array[][] = null;
if (arr[1] == 1 && arr[2] == 1) { // 排列方式:连续队形按行排列
int ans = 1;
array = new int[arr[0] / arr[3] + 2][arr[3] + 1];
for (int i = 1; i < array.length; i++) {
for (int j = 1; j < array[i].length; j++) {
array[i][j] = ans++;
if (array[i][j] == arr[4]) {
pr.print(i + " " + j + " ");
return;
}
}
}
}
if (arr[1] == 1 && arr[2] == 2) { // 排列方式:连续队形按列排列
array = new int[arr[3] + 1][arr[0] / arr[3] + 2];
for (int i = 1; i < array.length; i++) {
for (int j = 1; j < array[i].length; j++) {
if (j == 1)
array[i][j] = i;
else
array[i][j] = array[i][j - 1] + arr[3];
if (array[i][j] == arr[4]) {
pr.print(i + " " + j + " ");
return;
}
}
}
}
if (arr[1] == 2 && arr[2] == 1) { // 排列方式:梅花桩队形按行排列
int ans = 1;
array = new int[arr[0] / 2 + 2][arr[3] + 1];
for (int i = 1; i < array.length; i++) {
for (int j = 1; j < array[i].length; j++) {
if (i % 2 != 0 && j % 2 != 0)
array[i][j] = ans++;
if (i % 2 == 0 && j % 2 == 0)
array[i][j] = ans++;
if (array[i][j] == arr[4]) {
pr.print(i + " " + j + " ");
return;
}
}
}
}
if (arr[1] == 2 && arr[2] == 2) { // 排列方式:梅花队形按列排列
int ans = 0, lie = 0;
for (int i = 1; i <= arr[3]; i++)
if (i % 2 != 0)
ans++;
array = new int[arr[3] + 1][arr[0] / arr[3] * 2 + 2];
for (int i = 1; i < array.length; i++) {
for (int j = 1; j < array[i].length; j++) {
if (i % 2 != 0 && j == 1) {
array[i][j] = ++lie;
} else if (i % 2 != 0 && j % 2 != 0) {
array[i][j] = array[i][j - 2] + arr[3];
}
if (i % 2 == 0 && j == 2) {
array[i][j] = ++ans;
} else if (i % 2 == 0 && j % 2 == 0) {
array[i][j] = array[i][j - 2] + arr[3];
}
if (array[i][j] == arr[4]) {
pr.print(i + " " + j + " ");
return;
}
}
}
}
}
}
总结:暴力解法不是正解,如果不懂的或有什么地方疑惑的,欢迎您在评论区留言~