洛谷螺旋矩阵 java

题目来源

P2239 [NOIP2014 普及组] 螺旋矩阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

其实思路也很简单就是旋转,主要是如何不超出时间限制 

题目分析

这个题和蛇形方阵P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

该题解可见洛谷蛇形方阵(螺旋矩阵)java-CSDN博客

较为相似,主要就是不用把每一个值都算出,只要把那一个找出就行,如果按那道题的方式来算就会有部分超时,而只要把那一个找出就行这便是突破口,我们可以把直接从一端跳到另一端然后这之前先进行一个判断如果该值在这个过程中出现,则直接到该位置,并跳出循环

问题解决

边界的确立

只有确立好了边界才能有端点可言,才能进行下面的操作

int left=0;
int right=n-1;
int up=0;
int down=n-1;

端点跳跃的实现,边界的改变

举出一个例,从左上角开始

if(i==up&&j==left) {
	k=k+right-left+1;
	j=right;
	i++;
	up++;
}

这里主要点在于k加多少,所以有个right-left+1,便好

然后矩阵第一行就搞定了,所以说up++;

i++;说明的是现在位置的改变是在下一行了

这样才能循环起来

判断是否会跳过头

if(i==up&&j==left) {
	if(i==low-1&&j<=row-1&&right>=row-1) {
		for(;j<=row-1;j++) {
			k++;
		}
		break;
	}
	k=k+right-left+1;
	j=right;
	i++;
	up++;
}

进行一个比较,其实可以直接算出不用一个个加直到那个位置,可以自行修改一下

最后直接输出k的值即是所在行列的值

完整代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int low=sc.nextInt();
		int row=sc.nextInt();
		int k=0;
		int i=0;
		int j=0;
		int left=0;
		int right=n-1;
		int up=0;
		int down=n-1;
		while(k<=n*n){
			if(i==up&&j==left) {
				if(i==low-1&&j<=row-1&&right>=row-1) {
					for(;j<=row-1;j++) {
						k++;
					}
					break;
				}
			    k=k+right-left+1;
			    j=right;
			    i++;
			    up++;
			}else if(i==up&&j==right){
				if(j==row-1&&i<=low-1&&down>=low-1) {
					for(;i<=low-1;i++) {
						k++;
					}
					break;
				}
				k=k+down-up+1;
				i=down;
				j--;
				right--;
			}else if(i==down&&j==left) {
				if(j==row-1&&i>=low-1&&up<=low-1) {
					for(;i>=low-1;i--) {
						k++;
					}
					break;
				}
				k=k+down-up+1;
				i=up;
				j=left+1;
				left++;
			}else if(i==down&&j==right) {
				if(i==low-1&&j>=row-1&&left<=row-1) {
					for(;j>=row-1;j--) {
						k++;
					}
					break;
				}
				k=k+right-left+1;
				j=left;
				i=down-1;
				down--;
			}
		}
		System.out.print(k);
	}
}

C语言的学习者也可以看,因为其实思想是一样的

同样的也可尝试一下用递归怎么来做

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值