题目来源
P2239 [NOIP2014 普及组] 螺旋矩阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
其实思路也很简单就是旋转,主要是如何不超出时间限制
题目分析
这个题和蛇形方阵P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
较为相似,主要就是不用把每一个值都算出,只要把那一个找出就行,如果按那道题的方式来算就会有部分超时,而只要把那一个找出就行这便是突破口,我们可以把直接从一端跳到另一端然后这之前先进行一个判断如果该值在这个过程中出现,则直接到该位置,并跳出循环
问题解决
边界的确立
只有确立好了边界才能有端点可言,才能进行下面的操作
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语言的学习者也可以看,因为其实思想是一样的
同样的也可尝试一下用递归怎么来做