题目忘了,大意是:给你一个长度为n的整形数组A,你可以对A中的元素进行各种排列组合,看是否存在满足以下条件的数组:在该数组中,A[i]*A[i+1]%4==0,这里0<=i<=n-1。
数据输入格式是:第一行,一个整数n,表示数组的长度;第二行n个整数,表示数组的所有元素。
如果存在符合条件的数组,输出“Yes”,否则输出“No”。
先上代码(我不确定这个代码一定完全正确,但是我测试的数据结果都正常,把代码放在这里,主要是希望能有人再给指点指点)
import java.util.Scanner;
/**
* Created by gentl on 2017/9/9.
*/
public class T {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
//int testNum=in.nextInt();
while(in.hasNext()){
int n=in.nextInt();
int len=n;
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=in.nextInt();
}
boolean[][] reuslts=new boolean[n][n]; //results数组用来存放每个元素和其他元素的乘积是否能被4整除
int[] visited =new int[n]; //这里声明一个visited数组,以避免数组的重复访问
for(int k=0;k<n;k++){
visited[k]=0;
}
for(int i=0;i<n;i++) {
for (int j = 0; j < n; j++) {
if(i==j)reuslts[i][j]=false;
reuslts[i][j] = arr[i] * arr[j] % 4 == 0 ? true : false;
}
}
boolean flag=false; //flag用来表示是有有符合条件的排列组合
int count=0; //count用来控制每次循环的次数,count到达一定次数时跳出循环
int failed=0; //failed用来记录在n次大循环之后未成功找到符合条件的排列的次数
for(int i=0;i<n;i++){ //大循环,改循环就是对results数组进行深度优先遍历,类似于图的深度优先遍历(不知道这么说合不合适)
for(int k=0;k<n;k++){
visited[k]=0; //每次大循环都要将visited数组置零
}
visited[i]=1; //i表示每次循环的起始元素的下标
int k=i; //k用来表示每次循环内部的游标
count=0; //count置零,为了重新记录该次循环访问到的元素数
while(k<n){
count++; //起始元素已经被访问了,所以加一
flag=false; //
for( int j=0;j<n;j++){
if(reuslts[k][j]&&visited[j]==0&&k!=j){ //当该元素未被访问过,可以被4整除,说明该路径目前合法
flag=true;
visited[j]=1;
k=j; //k表示下一个要访问的行
break;
}
}
if(!flag){
failed++;
break;
}
if(count==n-1){ //这里count等于n-1即说明此行遍历结束
break;
}
}
if(count==n-1&&flag){
System.out.println("Yes");
break;
}
}
if(failed==len){
System.out.println("No");
}
}
}
}