数据结构猜数字问题

qq_38977024 2017-11-29 08:53:39
电脑提供个8位数字,并且每位数字互不相同。
电脑对生成的数字进行猜测
电脑将根据自己生成的数子显示XAXB
A前面的数宁代表数字正确位置也正确的数字的个数

B前面的数字代表数正 确但是位置不正确的数字的个数。
每局有12次机会。猜中或机会用尽将游戏结束。

求各位大神指点
...全文
578 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanta 2018-03-27
  • 打赏
  • 举报
回复
直接说你的思路吧,我估计大多数人没时间看代码
robig 2017-12-07
  • 打赏
  • 举报
回复
题目是要做这个游戏?还是要做这个游戏的解法?
qq_38977024 2017-11-29
  • 打赏
  • 举报
回复
运行结果老是不对,求指正
qq_38977024 2017-11-29
  • 打赏
  • 举报
回复
package 猜数字; import java.io.BufferedReader; public class Guess { public static void main(String[] argv) throws Exception { //int []you= {5,6,7,9,10,4,1,0}; //int d=0; //int t=0; //int[] array = new int[8]; GuessNum gn= new GuessNum(); java.io.BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in, "GBK")); int i = 1; while(true) { String guessSeed = gn.getNextSeed(); if(guessSeed.startsWith("我猜") || guessSeed.startsWith("前面")) { System.out.println(guessSeed); System.exit(0); } /* String str[] = guessSeed.split(","); // array[] = new int[str.length]; for(int z=0;z<str.length;z++) { array[z]=Integer.parseInt(str[z]); }*/ System.out.println(); System.out.println("我第" + i++ + "次猜, 这个数是" + guessSeed); System.out.println("请你说位置及值都对的有几个?"); /* for(int h=0;h<4;h++) { if(you[h]==array[h]) d++;//d 为本次你你猜对的数字并且位置正确的个数 }*/ //System.out.print(d); String s = br.readLine(); int a = Integer.parseInt(s); //int a = d; if(a == 8) { System.out.println("看,我猜对了吧!!!"); System.exit(0); } System.out.println("请你说值对但位置不对的有几个?"); s = br.readLine(); int b = Integer.parseInt(s); /*for(int q=0;q<8;q++) { for(int w=0;w<8;w++) { if(array[w]==you[q]) t++; } } t=t-d; int b = t; System.out.print(t);*/ gn.setGuessReuslt(a, b); } } } class GuessNum { boolean[] isValid; //是否有可能,为false时为不可能,true继续排除 int[] nums; //所有可能值,共19958400 * 8长,每8个作一个可能值,上面的isValid记录这19958400个可能性是否还有可能 int a, b, c, d, e, f, g, h; //上次猜测值,暂存 public GuessNum() { isValid = new boolean[19958400]; java.util.Arrays.fill(isValid, true); //刚开始时全有可能 nums = new int[19958400 * 8]; int pos = 0; //19958400 * 8数组中的位置 //初始化,把所有可能值的a, b, c, d....位全按8个一组放入nums中 for(int a=0;a<12;a++) { for(int b=0;b<12;b++) { if(a == b) continue; for(int c=0;c<12;c++) { if(a == c || b == c) continue; for(int d=0;d<12;d++) { if(a == d || b == d || c == d) continue; for(int e=0; e<12; e++) { if(a == e || b == e || c == e ||d == e) continue; for(int f=0;f<12;f++) { if(a == f || b == f|| c == f ||d==f||e == f) continue; for(int g=0;g<12;g++) { if(a == g || b == g|| c == g || d == g|| e == g || f == g) continue; for(int h=0;h<12;h++) { if(a == h || b == h|| c == h ||d == h|| e == h|| f == h || g == h) continue; nums[pos++] = a; nums[pos++] = b; nums[pos++] = c; nums[pos++] = d; nums[pos++] = e; nums[pos++] = f; nums[pos++] = g; nums[pos++] = h; } } } } } } } } } /** * 得到下一个猜测目标,如果没有了可能性,证明操作者前面输入错误,如果可能性只有一,立即确定 * @return */ public String getNextSeed() { int others = 0; int pos = 0; for(int i=0;i<19958400;i++) { if(isValid[i]) { if(others > 0) { others ++; break; } else { others++; pos = i; } } } if(others == 0) { return "前面你回答错了,查查吧"; } if(others == 1) { int i =pos * 8; return "我猜这个数一定是" +" \n"+ nums[i++] + nums[i++] + nums[i++] + nums[i++]+ nums[i++]+ nums[i++]+ nums[i++]+ nums[i++]; } for(int i=0;i<19958400;i++) { if(isValid[i]) { i*=8; a = nums[i]; b = nums[i+1]; c = nums[i+2]; d = nums[i+3]; e = nums[i+4]; f = nums[i+5]; g = nums[i+6]; h = nums[i+7]; return new StringBuffer().append(nums[i++]).append(nums[i++]).append(nums[i++]).append(nums[i++]).append(nums[i++]).append(nums[i++]).append(nums[i++]).append(nums[i++]).toString(); } } //理论上不可能到这一步 throw new java.lang.RuntimeException("前面你回答错了,查查吧"); } //设置操作者的反馈(x 个 a, y 个 b) public void setGuessReuslt(int x, int y) { if(x == 8) { return; } for(int pos = 0; pos < 19958400; pos++) { if(!isValid[pos]) continue; int numspos = pos * 8; if(getMyX(pos) != x) { isValid[pos] = false; continue; } if(getMyY(pos) != y) { isValid[pos] = false; continue; } } } //测试,把每个可能值都与上次猜测值比较,就会得到这个可能值与猜测值是几个a的关系 private int getMyX(int pos) { int myx = 0; pos*=8; if(nums[pos++] == a) myx++; if(nums[pos++] == b) myx++; if(nums[pos++] == c) myx++; if(nums[pos++] == d) myx++; if(nums[pos++] == e) myx++; if(nums[pos++] == f) myx++; if(nums[pos++] == g) myx++; if(nums[pos++] == h) myx++; return myx; } //测试,把每个可能值都与上次猜测值比较,就会得到这个可能值与猜测值是几个b的关系 private int getMyY(int pos) { int myy = 0; pos *= 8; if(nums[pos] == b || nums[pos] == c || nums[pos] == d||nums[pos] == e||nums[pos] == f||nums[pos] == g||nums[pos] == h) myy ++; if(nums[pos+1] == a || nums[pos+1] == c || nums[pos+1] == d|| nums[pos+1] == e|| nums[pos+1] == f|| nums[pos+1] == g|| nums[pos+1] == h) myy++; if(nums[pos+2] == a || nums[pos+2] == b || nums[pos+2] == d|| nums[pos+2] == e|| nums[pos+2] == f|| nums[pos+2] == g|| nums[pos+2] == h) myy++; if(nums[pos+3] == a || nums[pos+3] == b || nums[pos+3] == c|| nums[pos+3] == e|| nums[pos+3] == f|| nums[pos+3] == g|| nums[pos+3] == h) myy++; if(nums[pos+4] == a || nums[pos+4] == b || nums[pos+4] == c|| nums[pos+4] == d|| nums[pos+4] == f|| nums[pos+4] == g|| nums[pos+4] == h) myy++; if(nums[pos+5] == a || nums[pos+5] == b || nums[pos+5] == c|| nums[pos+5] == d|| nums[pos+5] == e|| nums[pos+5] == g|| nums[pos+5] == h) myy++; if(nums[pos+6] == a || nums[pos+6] == b || nums[pos+6] == c|| nums[pos+6] == d|| nums[pos+6] == e|| nums[pos+6] == f|| nums[pos+6] == h) myy++; if(nums[pos+7] == a || nums[pos+7] == b || nums[pos+7] == c|| nums[pos+7] == d|| nums[pos+7] == e|| nums[pos+7] == f|| nums[pos+7] == g) myy++; return myy; } }

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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