本题考查
逻辑?
思路
题目要求按照顺序输出狼人编号,所以按照顺序对每一个穷举情况进行判断。
判断的思路:
- isHuman数组存储该用户的身份,1代表人类,-1代表狼
- 从头开始对每一个用户的发言进行判断,若该用户所指定的角色与isHuman的角色不符(
arr[i]*isHuman[Math.abs(arr[i]) - 1] < 0
),则说明该用户说谎,将该用户的角色(isHuman[i]
)加入列表list - 对每一个用户发言判断完毕后,若列表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");
}
}