PAT甲级1148 Werewolf - Simple Version(JAVA版)

31 篇文章 0 订阅

本题考查

逻辑?

思路

题目要求按照顺序输出狼人编号,所以按照顺序对每一个穷举情况进行判断。
判断的思路:

  1. isHuman数组存储该用户的身份,1代表人类,-1代表狼
  2. 从头开始对每一个用户的发言进行判断,若该用户所指定的角色与isHuman的角色不符(arr[i]*isHuman[Math.abs(arr[i]) - 1] < 0),则说明该用户说谎,将该用户的角色(isHuman[i])加入列表list
  3. 对每一个用户发言判断完毕后,若列表list的长度为2且列表中两用户的角色加和为0(list.get(0)+list.get(1) == 0),代表说谎的为一人一狼,满足条件,输出。(柳神这个存储用户角色,然后通过加和为0判断一人一狼的思路真的很妙,大神就是大神,膜膜膜)

注意:本代码数组从0开始,但题目要求序号从1开始,所以代码arr[i]*isHuman[Math.abs(arr[i]) - 1] < 0中的数组下标是Math.abs(arr[i]) - 1

思路参考:柳神博客

AC代码

import java.util.LinkedList;
import java.util.Scanner;

public class Main {
	static int[] arr;
	static boolean check(int w1, int w2) {
		LinkedList<Integer> list = new LinkedList<Integer>();
		int[] isHuman = new int[arr.length];
		for(int i = 0; i < arr.length; i++)	isHuman[i] = 1;
		isHuman[w1] = isHuman[w2] = -1;
		for(int i = 0; i < arr.length; i++)
			if(arr[i]*isHuman[Math.abs(arr[i]) - 1] < 0) list.add(isHuman[i]);
		if(list.size() == 2 && list.get(0)+list.get(1) == 0) {
			System.out.println((w1+1) + " " + (w2+1));
			return true;
		}else return false;
	}

	public static void main(String[] args) {
		Scanner scaner = new Scanner(System.in);
		int num = scaner.nextInt();
		arr = new int[num];
		for (int i = 0; i < num; i++) arr[i] = scaner.nextInt();
		scaner.close();
		boolean haveSolvation = false;
		loop:
		for (int i = 0; i < num; i++)
			for(int j = i + 1 ; j < num ; j++)
				if(check(i,j)) {
					haveSolvation = true;
					break loop;
				}
		if(!haveSolvation) System.out.println("No Solution");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值