根據入棧順序求出棧順序
阿新 • • 發佈:2019-01-10
題目描述:給定一個序列B表示入棧的順序,求所有的不可能出棧順序和可能的出棧順序
題目分析:當一個元素出棧後,緊著接著出棧的元素可以是該元素後面的任意一個元素,或者是該元素前面的離該元素最近的一個未出棧元素。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class T1 {
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] b=new int[n];
used=new boolean[n];
for(int i=0;i<n;i++)
{
b[i]=in.nextInt();
}
int[] a=new int[n];
dfs(a, 0, n, b);
System.out.println("不滿足:");
for(String str:list)
{
System.out.println(str );
}
System.out.println("滿足");
for(String str:list2)
{
System.out.println(str);
}
}
static boolean[] used;
static List<String> list=new ArrayList<>();
static List<String> list2=new ArrayList<>();
static void dfs(int[] a,int index,int n,int[] b)//用dfs遍歷所有的序列組合
{
if(index>=n)
{
if(!judge(a, b))
{
String str=Arrays.toString(a);
list.add(str);
}else
{
String str=Arrays.toString(a);
list2.add(str);
}
return;
}
for(int i=0;i<n;i++)
{
if(used[i])
continue;
a[index]=b[i];
used[i]=true;
dfs(a, index+1, n, b);
used[i]=false;
}
}
static boolean judge(int[] a,int[] b)//b:入棧順序,a:出棧順序
{
//假設序列的最大值不超過100
int[] idx=new int[100];
boolean[] vis=new boolean[100];
for(int i=0;i<b.length;i++)
{
idx[b[i]]=i;
}
int pre=idx[a[0]];
vis[pre]=true;
for(int i=1;i<a.length;i++)
{
if(idx[a[i]]>pre)
{
pre=idx[a[i]];
vis[pre]=true;
continue;
}
for(int j=pre-1;j>=0;j--)
{
if(vis[j])
continue;
if(a[i]==b[j])
{
pre=j;
vis[j]=true;
break;
}else
return false;
}
}
return true;
}
}