PAT Basic 1050

1050 螺旋矩阵

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N;m≥n;且 m?n 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 10?4??,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:

12
37 76 20 98 76 42 53 95 60 81 58 93

输出样例:

98 95 93
42 37 81
53 20 76
58 60 76

  题解:这道题要解决这两个问题:  1.确定m和n。  2.如何按照格式输出。  我们先说第一个问题,他要求m*n=N,我们可以从根号N开始向下找,找到的第一个可以被N整除的数即为n,同时可以算出m。  第二个问题,确定m和n后,我们可以开一个大小为m+1*n+1的数组,用来记录这个螺旋矩阵,按照右,下,左,上的顺序进行填充,遇到填充过的就改变方向直到填充完成即可。

代码如下:
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<math.h>
 4 #include<cstring>
 5
 6 using namespace std;
 7
 8 int a[10000];
 9
10 bool cmp( const int &a, const int &b){
11     return a > b;
12 }
13
14 int main()
15 {
16     int N, m, n;
17     scanf("%d",&N);
18     for( int i = 0; i < N; i++)
19         scanf("%d",&a[i]);
20
21     sort(a,a+N,cmp);
22     for( int i = sqrt(N); i >= 1; i--){
23         if( N%i == 0){
24             m = N/i;
25             n = i;
26             break;
27         }
28     }
29
30     int i = 0, j = 0, num = 0;
31     int b[m][n];
32     int c[m][n];
33     memset(c,0,sizeof(c));
34     b[i][j] = a[num++];
35     c[i][j] = 1;
36     while(num < N){
37         while( j + 1 < n && c[i][j+1] == 0){
38             j++;
39             b[i][j] = a[num++];
40             c[i][j] = 1;
41         }
42         while( i + 1 < m  && c[i+1][j] == 0 ){
43             i++;
44             b[i][j] = a[num++];
45             c[i][j] = 1;
46         }
47         while(  j - 1 >= 0  && c[i][j - 1] == 0 ){
48             j--;
49             b[i][j] = a[num++];
50             c[i][j] = 1;
51         }
52         while( i - 1 >= 0  && c[i-1][j] == 0){
53             i--;
54             b[i][j] = a[num++];
55             c[i][j] = 1;
56         }
57     }
58     for( int i = 0; i < m; i++){
59         printf("%d",b[i][0]);
60         for( int j = 1; j < n; j++){
61             printf(" %d",b[i][j]);
62         }
63         printf("\n");
64     }
65     return 0;
66 }

原文地址:https://www.cnblogs.com/yxp400/p/9461655.html

时间: 2024-10-04 05:04:06

PAT Basic 1050的相关文章

PAT Basic 1050 螺旋矩阵 (25 分)

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N:m≥n:且 m−n 取所有可能值中的最小值. 输入格式: 输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数.所有数字不超过 1,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行 n 个数字,共 m 行.相邻数字以 1 个空格分隔,行末不得有多余空格. 输入样例: 12 3

PAT (Basic Level) Practise (中文) 1005

1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对n=3进行验证的时候,我们需要计算3.5.8.4.2.1,则当我们对n=5.8.4.2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重

PAT (Basic Level) Practise (中文)1004. 成绩排名 (20)

读入n名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式:每个测试输入包含1个测试用例,格式为 第1行:正整数n 第2行:第1个学生的姓名 学号 成绩 第3行:第2个学生的姓名 学号 成绩 ... ... ... 第n+1行:第n个学生的姓名 学号 成绩 其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的. 输出格式:对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低

PAT Basic 1057 数零壹 (20 分)

给定一串长度不超过 1 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有多少 0.多少 1.例如给定字符串 PAT (Basic),其字母序号之和为:16+1+20+2+1+19+9+3=71,而 71 的二进制是 1000111,即有 3 个 0.4 个 1. 输入格式: 输入在一行中给出长度不超过 1.以回车结束的字符串. 输出格式: 在一行中先后输出 0 的个数和 1 的个数,其间以空格分隔

PAT (Basic Level) Practise 1040 有几个PAT(DP)

1040. 有几个PAT(25) 时间限制 120 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串,问一共可以形成多少个PAT? 输入格式: 输入只有一行,包含一个字符串,长度不超过105,只包含P.A.T三种字母. 输出格式: 在一行中输出给定字符串中

PAT (Basic Level) Practise 1003. 我要通过!

1003. 我要通过! 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: 1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符:2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是

PAT (Basic Level) Practise:1040. 有几个PAT

[题目链接] 字符串APPAPT中包含了两个单词“PAT”,其中第一个PAT是第2位(P),第4位(A),第6位(T):第二个PAT是第3位(P),第4位(A),第6位(T). 现给定字符串,问一共可以形成多少个PAT? 输入格式: 输入只有一行,包含一个字符串,长度不超过105,只包含P.A.T三种字母. 输出格式: 在一行中输出给定字符串中包含多少个PAT.由于结果可能比较大,只输出对1000000007取余数的结果. 输入样例: APPAPT 输出样例: 2 提交代码: 1 #includ

PAT Basic 1032

1032 挖掘机技术哪家强 为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过10^5^的正整数N,即参赛人数.随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号).及其比赛成绩(百分制),中间以空格分隔. 输出格式: 在一行中给出总得分最高的学校的编号.及其总分,中间以空格分隔.题目保证答案唯一,没有并列. 输入样例: 6 3 65 2 80 1 100 2 70

PAT Basic 1085

1085 PAT单位排行 每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜.本题就请你实现这个功能. 输入格式: 输入第一行给出一个正整数 N(≤10?5??),即考生人数.随后 N 行,每行按下列格式给出一个考生的信息: 准考证号 得分 学校 其中准考证号是由 6 个字符组成的字符串,其首字母表示考试的级别:B代表乙级,A代表甲级,T代表顶级:得分是 [0, 100] 区间内的整数:学校是由不超过 6 个英文字母组成的单位码(大小写无关).注意:题目保证每个考生的准考证号是不同的.