PAT乙级1050

1050. 螺旋矩阵(25)

时间限制
150 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

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

输入格式:

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

输出格式:

输出螺旋矩阵。每行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

#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iomanip>
using namespace std;
int cmp(int a, int b)
{
	return a > b;
}
/*public class Helix {

static int N = 0;

public static int Helix(int x, int y) {
if ((x==1) && (y==1)) return 1;
if ((x-y>=1)&&(x+y<=N)) return (1 + Helix(x+1,y));
if ((x-y>=1)&&(x+y>N)) return (1 + Helix(x, y+1)); 
if ((x-y<1)&&(x+y<=N+1)) return (1 + Helix(x, y-1));
if ((x-y<1)&&(x+y)>N+1) return (1 + Helix(x-1,y));
else return 0;} 

public static void main(String[] args) {

N = //输入int值;
for (int i= 1; i <= N; i++){
for (int j= 1; j <= N; j++)
System.out.print(Helix(i,j) + "\t");
System.out.println(""); }


}}这个就是先把矩阵每个位置二元组转换成一维时对应的数值求出来,我转别人的,不是自己想的,实质就是迷宫求解问题
*/
int main()
{
	int N;
	cin >> N;
	int t;
	int N1 = N;
	vector<int> v;
	while (N--)
	{
		cin >> t;
		v.push_back(t);
	}
	sort(v.begin(), v.end(), cmp);//非递增
	int i;
	for (i = sqrt(N1); i <= N1; i++)
	{
		if (N1%i == 0)
			break;
	}//m和n肯定一个小于等于N平方根另一个大于等于N平方根
	int m = max(i,N1/i), n = N1 / m;
	int**a = new int*[m];
	for (int i = 0; i < m; i++)
	{
			a[i] = new int[n];
	}
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			a[i][j] = 0;
		}
	}//必须初始化为0
	
	i = 0;
	int x = 0, y = 0;
	while (i < N1)
	{
		while (y < n&&!a[x][y])
			a[x][y++] = v[i++];
		y--;
		x++;
		while (x < m && !a[x][y])
			a[x++][y] = v[i++];
		x--;
		y--;
		while (y >= 0 && !a[x][y])
			a[x][y--] = v[i++];
		y++;
		x--;
		while (x >= 0 && !a[x][y])
			a[x--][y] = v[i++];
		x++;
		y++;
	}//螺旋放置的过程:先声明横坐标x和纵坐标y,然后类似走迷宫的方式,若前面能走(即判断下一个位置是否为0,不为0就不能进行赋值了)
	//分为四个过程,右下左上,依次进行即可
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cout << a[i][j];
			if (j != n - 1)
				cout << " ";
			else
				cout << endl;
		}
		
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值