老师上课讲了一道经典的题,我有点没看懂,能解释一下他的步骤吗?指针那块好迷茫啊

img

img

img

img

img

import java.util.*;
class Peanuk{
    public int i,j;//i为行号,j为列号
    public int num;//花生数量
    public Peanuk next;//下一个
    
    public Peanuk() {
        super();
    }
    public Peanuk(int i, int j, int num) {
        super();
        this.i = i;
        this.j = j;
        this.num = num;
    }
    
}

public class PickPeanuk {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //定义一个类:存储数据
        Peanuk head=new Peanuk();//num:表示有多少个结点。next:指向第一个结点。
        Peanuk node;
        Scanner sc=new Scanner(System.in);
        int n,i,j,x,y,time,num;//x 行,y 列 
        n=sc.nextInt();
        Peanuk pre;
        while(n>0) {        
            head.num=0;
            head.next=null;
            x=sc.nextInt();
            y=sc.nextInt();
            time=sc.nextInt();
            for(i=0;i<x;i++) {
                for(j=0;j<y;j++) {
                    num=sc.nextInt();
                    if(num!=0) {
                        node=new Peanuk((i+1),(j+1),num);
                        //插入排序
                        pre=head;
                        if(head.num==0) {
                            head.num++;
                            head.next=node;
                        }else{
                            head.num++;
                            while((pre.next!=null)&&(pre.next.num>node.num)) {
                                pre=pre.next;
                            }
                            //pre.next==null
                            if(pre.next==null) {
                                pre.next=node;
                            }else if(pre.next.num<node.num) {
                                node.next=pre.next;
                                pre.next=node;
                            }
                        }
                    }
                }
            }
            //计算时间和数量
            node=head.next;
            num=0;
            int timeCount;
            pre=head;
            node=pre.next;
            for(i=0;i<head.num;i++) {
                //System.out.println("("+node.i+","+node.j+")"+node.num);
                //计算第i个结点的花生能不能采?
                //当前的位置到第i个结点的位置时间+1(采摘时间)+从第i个结点位置返回的时间<time的剩余
                
                if(i==0) {//第一个
                    timeCount=node.i+1+node.i;
                }else {
                    timeCount=Math.abs(pre.i-node.i)+Math.abs(pre.j-node.j)+1+node.i;
                }
                
                if(time<timeCount) {
                    break;
                }else {
                    num=num+node.num;
                    time=time-timeCount+node.i;
                }
                
                pre=pre.next;
                node=node.next;
            }
            System.out.println(num);
            n--;
        }
    }

}

兄弟,,java没有指针;

所以,我不知你说的指针在哪里

题描述的不好,步骤描述那里出题人自己也混乱了,没有说清。这个东西叫链表,它不叫指针。

  1. 这个花生田可以模拟成二维数组
  2. 花生田里有花生,花生的坐标和数目都给出了
  3. 首次要选花生最多的坐标,走过去
  4. 然后要选剩余坐标中花生数目最多的坐标,这时候不一定要去【超时会无效】,不能采集就直接出去
  • 因为采花生的顺序是由多到少,这个顺序是唯一的,所以可以构造一条链表。