码迷,mamicode.com
首页 > 编程语言 > 详细

POJ1591 M*A*S*H (JAVA)

时间:2018-09-13 14:27:32      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:void   rds   print   asn   card   line   测试   return   循环   

这水题,真的坑

测试数据最后有空行,如果用sc.hasNextLine()判断,会RE

要改为sc.hasNext()

搞了我一上午,烦死

import java.util.*;
public class POJ1591 {
    static Scanner sc = new Scanner(System.in);
    static int N=20;
    static class Item{
        int name;
        Item next;
        Item pre;
    }
    static Item first;
    static Item last;
    static int[] cards;
    static void count(int total,int left){
        if(total<=left){
            Item item = first.next;
            while (item!=null){
                if(item.next!=null)
                    System.out.print(item.name+" ");
                else
                    System.out.println(item.name);
                item=item.next;
            }
            return;
        }

        int icard=0,card=0;
        // 循环直到剩下left个人
        while (total>left){
            Item item=first.next;
            card=cards[icard++];

            while (item!=null){
                //每次向前走cards[icard]步
                int i;
                for(i=1;i<card;i++){
                    if(item!=null)
                        item=item.next;
                    else
                        break;
                }
                if(i==card && item!=null) {
                    total--;
                    //删除第cards[cardi]个人
                    if (item.pre != null) {
                        item.pre.next = item.next;
                    }
                    if (item.next != null) {
                        item.next.pre = item.pre;
                    }
                    if (item == last)
                        last = item.pre;
                    item = item.next;
                }
                // 只剩left个人,输出结果
                if(total==left){
                    item = first.next;
                    while (item!=null){
                        if(item.next!=null)
                            System.out.print(item.name+" ");
                        else
                            System.out.println(item.name);
                        item=item.next;
                    }
                    return;
                }

            }

        }
    }


    static void run(){
        // 构建链表
        first = new Item();
        first.next=first.pre=null;
        first.name=Integer.MIN_VALUE;
        last=first;
        String[] s = sc.nextLine().split(" ");
        // 总人数
        int n=Integer.parseInt(s[0]);
        // 可以回家的人数
        int left = Integer.parseInt(s[1]);
        cards = new int[N];
        for(int i=1;i<=n;i++){
            Item item = new Item();
            item.name = i;
            item.next = null;
            item.pre = last;
            last.next = item;
            last=item;
        }
        // 初始化卡片数组
        for(int i=2;i<s.length;i++){
            cards[i-2]=Integer.parseInt(s[i]);
        }
        // 进入计算
        count(n,left);
    }

    public static void main(String[] args) {
        int so=1;
        while (sc.hasNext()){
            System.out.println("Selection #"+so);
            run();
            System.out.println();
            so++;
        }
    }
}

  

POJ1591 M*A*S*H (JAVA)

标签:void   rds   print   asn   card   line   测试   return   循环   

原文地址:https://www.cnblogs.com/StackNeverOverFlow/p/9639554.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!