使用直接插入算法实现杯子交换

交替放置的玻璃杯

题目:有2n个玻璃杯挨个排成一排,前n个装满苏打水,其余n个杯子为空。交换杯子的位置,使之按照满—空—满—空的模式排列,而且杯子移动的次数要最少

解题思路:使用插入排序算法,将白色的杯子一个个插入到黑色杯子中,就可以得到黑白相间的杯子序列。但是将白色杯子插入的时候会发现,最终的杯子序列中有些白杯子的位置并没有变化,所以拿白杯子插入应该是间隔(间隔为1)拿;插进黑色序列时候,发现直接插入两个黑色杯子,则白色插入位置后到白色杯子初始位置间的杯子需要整体后移一下,所以不插入,把白色杯子与两个相邻的黑色杯子中的第二个进行交换。

代码实现:

public class CupInsert {
static int count = 0;
public static void main(String[] args) {
System.out.println("请输入n的值(n>0):");
Scanner scanner = new Scanner(System.in);
String read = scanner.nextLine();
int n = Integer.parseInt(read);
arrayBulid(n);
System.out.println("杯子交换前的顺序(1-黑,0-白):");
for(int i=0;i<arrayBulid(n).length;i++){
System.out.print(arrayBulid(n)[i]+"--");
if((i+1)%10==0){
System.out.println(" ");
}
}
System.out.println(" ");
int[] result = cpuInsert(arrayBulid(n),n);
System.out.println("杯子交换后的顺序(1-黑,0-白):");
for(int i=0;i<=2*n-1;i++){
System.out.print(result[i]+"--");
if((i+1)%10==0){
System.out.println(" ");
}
}
System.out.println(" ");
System.out.println("交换的次数:"+count);
}
/*
*判断n为奇数还是偶数,然后交换杯子,得到交换杯子的序列以及交换次数
*/

private static int[] cpuInsert(int[] arrayBulid, int n) {
if(n%2==0){
for(int j=n;j<=2*n-1;j=j+2){
for(int i=0;i<n-1;i++){
if((arrayBulid[i]+arrayBulid[j]==1)&&(arrayBulid[i+1]+arrayBulid[j]==1)){
int t = arrayBulid[i+1];
arrayBulid[i+1]=arrayBulid[j];
arrayBulid[j]=t;
i=n-1;
}
}
count=count+1;
}
}else{
for(int j=n+1;j<=2*n-1;j=j+2){
for(int i=0;i<n-1;i++){
if((arrayBulid[i]+arrayBulid[j]==1)&&(arrayBulid[i+1]+arrayBulid[j]==1)){
int t = arrayBulid[i+1];
arrayBulid[i+1]=arrayBulid[j];
arrayBulid[j]=t;
}
}
count=count+1;
}
}

return arrayBulid;

}

/*
*构建存放原始杯子顺序的数组
*/
private static int[] arrayBulid(int n) {
int cup[] = new int[2*n];
for(int i=0;i<n;i++){
cup[i] = 1;
}
for(int i=n;i<2*n;i++){
cup[i] = 0;
}
return cup;
}

}

如果杯子之间只能两两交换呢?该怎么解决?

代码实现:

public class CupTransmit {
static int count=0;
public static void main(String[] args) {
System.out.println("请输入n的值(n>0):");
Scanner scanner = new Scanner(System.in);
String read = scanner.nextLine();
int n = Integer.parseInt(read);
// System.out.println(n);
arrayBulid(n);
System.out.println("杯子交换前的顺序(1-黑,0-白):");
for(int i=0;i<arrayBulid(n).length;i++){
System.out.print(arrayBulid(n)[i]+"--");
if((i+1)%10==0){
System.out.println(" ");
}
}
System.out.println(" ");
int[] result = cupChange(arrayBulid(n),n);
System.out.println("杯子交换后的顺序(1-黑,0-白):");
for(int j=0;j< result.length;j++){
System.out.print(result[j]+"--");
if((j+1)%10==0){
System.out.println(" ");
}
}
System.out.println(" ");
System.out.println("交换的次数:"+count);

}
//交换杯子的序列
private static int[] cupChange(int[] arrayBulid, int n) {
for(int i=1;i<2*n-1;i++){
if((arrayBulid[i-1]+arrayBulid[i]==2)&&(arrayBulid[i]+arrayBulid[i+1]==1)){
int t = arrayBulid[i];
arrayBulid[i] = arrayBulid[i+1];
arrayBulid[i+1] = t;
count++;
}

}
for(int j=1;j<2*n-1;j++){
if((arrayBulid[j-1]+arrayBulid[j]!=1)||(arrayBulid[j]+arrayBulid[j+1]!=1)){
cupChange(arrayBulid, n);
}
}
return arrayBulid;
}
//构建存放原始杯子顺序的数组
private static int[] arrayBulid(int n) {
int cup[] = new int[2*n];
for(int i=0;i<n;i++){
cup[i] = 1;
}
for(int i=n;i<2*n;i++){
cup[i] = 0;
}
return cup;
}
}

 

posted @ 2017-12-14 16:42  小买  阅读(997)  评论(0编辑  收藏  举报