编程实现:两个1,两个2....两个7,两个1之间有一个其他数,两个2之间有2个其他数...两个7之间有7个其他数。

cyl654809 2014-12-09 03:48:36
编程实现:两个1,两个2....两个7,两个1之间有一个其他数,两个2之间有2个其他数...两个7之间有7个其他数。
当时自己写的时候理解错误了,理解成两个1之间至少有一个其他数,两个2之间至少有2个其他数....这种了,这种我实现了。
但不符合要求。求大神编程实现.
JAVA \C\C++都可.
...全文
126 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
冥王之锤 2014-12-10
  • 打赏
  • 举报
回复
引用 6 楼 t_jl1979 的回复:
如果是以74开头的,那么这个数不存在。 楼主是否记错了?
昨天算错了,今天补一下,7,4位置已知,很快就可以算出来:
package test;

import java.util.ArrayList;
import java.util.List;

public class AllSort {
	public static void main(String[] args) {
		char buf[] = { '7', '4', '1', '1', '2', '2', '4', '3', '7', '5', '5', '6', '6', '3' };

		perm(buf, 2, buf.length - 1);
	}

	/**
	 * @param buf
	 * @param start
	 * @param end
	 */
	public static void perm(char[] buf, int start, int end) {
		if (start == end) {// 当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
			checkNum(buf, end);
		} else {// 多个字母全排列
			for (int i = start; i <= end; i++) {
				char temp = buf[start];// 交换数组第一个元素与后续的元素
				buf[start] = buf[i];
				buf[i] = temp;

				perm(buf, start + 1, end);// 后续元素递归全排列

				temp = buf[start];// 将交换后的数组还原
				buf[start] = buf[i];
				buf[i] = temp;
			}
		}
	}

	private static void checkNum(char[] buf, int end) {
		boolean flag = true;
		List<Character> tmpList = new ArrayList<>();
		for (int i = 0; i <= end; i++) {
			char tmp = buf[i];
			if (tmpList.contains(tmp)) {
				continue;
			}
			tmpList.add(tmp);
			int nextIndex = i + Integer.valueOf(tmp + "") + 1;
			if (nextIndex > end || buf[nextIndex] != tmp) {
				flag = false;
			}
		}
		if (flag) {
			System.out.println(buf);
		}
	}
}
结果是: 74151643752362
冥王之锤 2014-12-09
  • 打赏
  • 举报
回复
如果是以74开头的,那么这个数不存在。 楼主是否记错了?
cyl654809 2014-12-09
  • 打赏
  • 举报
回复
引用 4 楼 l359122505 的回复:
参考下这个代码:

class C {
    static void findSo(int[] a, int n) {
        for (int i = 0; i < 14; i++) {
            if (i + n + 1 < 14 && a[i] == 0 && a[i + n + 1] == 0) {
                a[i] = n;
                a[i + n + 1] = n;

                if (n == 7) {
                    for (int j = 0; j < 14; j++) {
                        System.out.print(a[j]);
                    }
                    System.out.print("\n");
                } else {
                    findSo(a, n + 1);
                }
                a[i] = 0;
                a[i + n + 1] = 0;
            }
        }
    }

    public static void main(String[] args) {
        int[] a = new int[14];
        findSo(a, 1);
    }
}
正解. 这样的方法我发帖子前试过.但是跑起来结果有误,可能是我判断的时候弄错了,同学要拆电脑就没调试。 谢谢啦,来者有分。
繁华终归落尽 2014-12-09
  • 打赏
  • 举报
回复
参考下这个代码:

class C {
    static void findSo(int[] a, int n) {
        for (int i = 0; i < 14; i++) {
            if (i + n + 1 < 14 && a[i] == 0 && a[i + n + 1] == 0) {
                a[i] = n;
                a[i + n + 1] = n;

                if (n == 7) {
                    for (int j = 0; j < 14; j++) {
                        System.out.print(a[j]);
                    }
                    System.out.print("\n");
                } else {
                    findSo(a, n + 1);
                }
                a[i] = 0;
                a[i + n + 1] = 0;
            }
        }
    }

    public static void main(String[] args) {
        int[] a = new int[14];
        findSo(a, 1);
    }
}
cyl654809 2014-12-09
  • 打赏
  • 举报
回复
引用 1 楼 u012171905 的回复:
我觉得楼主已经实现的比原来的这样要难一点啊,难的都有了,简单的还不会么
这道题是当时考试时候现场编的,现在没思路阿。看看有没有高手请教一下。 下面是我当时写的代码:

import java.util.Scanner;

/**
 * 
 * @author Cyl-29
 *
 */

/**
 * 7对数(1-7),组成一个14位的数.
 * 要求两个1之间有1个其他数字,
 * 两个2之间有2个其他数字……
 * 两个7之间有7个其他数字。
 * 
 * 例子:忘记了 * 
 * 编程找出74开头的这14位数.
 */



public class Qi {
	
	static int num[] = new int[15];
	static int vis[] = new int[8];
	
	static void print(){
		for(int i=1; i<15; i++){
			System.out.print(num[i]);
		}
		System.out.println();
		//暂停.
		Scanner cin = new Scanner(System.in);
		cin.nextLine();
	}
	
	static void dfs(int begin,int n){
		if(begin == n){
			print();
		}else{
			for(int i=7; i>0; i--){
				
				//短路加快程序运行.
				if(i==7 && begin<9)
					continue;
				
				if(i==4 && begin<7)
					continue;
	
				int min = begin-i>0?begin-i:0;
				boolean flag = true;
				if(i>=3 && i<=6){
					for(int j=begin-1; j>min; j--){
						if(i==num[j])
							flag = false;//
					}
				}
				
				if(i==1 && num[begin-1]==1)
					continue;
				if(i==2 && (num[begin-1] == 2 || num[begin-2] == 2) )
					continue;
			
				if(flag && vis[i]<2){
					vis[i]++;
					num[begin] = i;
					dfs(begin+1,n);
					vis[i]--;
				}
			}
		}
	}
	public static void main(String []args){
		//74开头.
		num[1] = 7; num[2] = 4;
		//74各使用一次.
		vis[7] = 1; vis[4] = 1;
		
		dfs(3,15);
	}
}
wyc_ 2014-12-09
  • 打赏
  • 举报
回复
同意楼上
Coder_D 2014-12-09
  • 打赏
  • 举报
回复
我觉得楼主已经实现的比原来的这样要难一点啊,难的都有了,简单的还不会么

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧