A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 飞鸟青崖 中级黑马   /  2013-6-2 16:34  /  1920 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 飞鸟青崖 于 2013-6-3 11:37 编辑

题目:
       有4名同学参加数学竞赛,3个老师对他们的名次进行的预测。每一个老师只预测两个同学的排名。而竞赛结果表明每一个老师都预测对了一半。编写一个程序,使它能能根据老师的预测得到正确的结果。
注意:
      老师的预测内容是不固定的。但老师的人数是固定的,只有3个。学生的人数也是固定的,只有4个。并且一定可以根据老师的预测得到正确的排名。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

2 个回复

正序浏览
  1. package mytest;

  2. import java.util.Scanner;

  3. public class Test14 {

  4.         /**
  5.          * 竞赛结果表明,他们都说对了一半,说错了一半,并且无并列名次,试编程输出a,b,c,d的各个名次。
  6.          * 分析:
  7.          * 我们将老师的预测列成二维数组形式。行数是老师的人数,也就是3.列数为5。
  8.          * 第一列表示该老师预测对的个数。由于一个老师预测了两部分,所以将初始值都设置为2.
  9.          * 我们首先假设第一个老师的第一部分预测时对的,那么就需要将预测了同一人,预测了同一名次,
  10.          * 以及第一个老师的另一部分预测全部设置为null,并且将相应的预测数减1.直到某一个预测数为0时,
  11.          * 那么这个假设就是错误的。
  12.          * @param args
  13.          */
  14.         public static void main(String[] args) {
  15.                 String[][] str = new String[3][5];
  16.                 for(int x = 0;x<3;x++){
  17.                         str[x][0] = 2+"";
  18.                 }
  19.                 System.out.println("注意:输入时人与名次用等号连接,人与人之间用逗号隔开。");
  20.                 for(int x = 1;x<=3;x++){
  21.                         System.out.print("请输入第"+x+"个老师的预测:");
  22.                         Scanner sc = new Scanner(System.in);
  23.                         String a = sc.next();
  24.                         int firstd = a.indexOf("=");
  25.                         int lastd = a.lastIndexOf("=");
  26.                         int dou = a.indexOf(",");
  27.                         str[x-1][Integer.parseInt(a.substring(firstd+1,dou))] = a.substring(0, firstd);
  28.                         str[x-1][Integer.parseInt(a.substring(lastd+1))] = a.substring(dou+1, lastd);
  29.                 }
  30.                 String[][] bei = new String[3][5];//将数组备份,方便还原。
  31.                 bei= fu(str,bei);
  32.                         //由于第一个老师肯定会预测对一个,所以不需要进行行的遍历。
  33.                         for(int y = 1;y<5;y++){
  34.                                 if(str[0][y] == null)
  35.                                         continue;
  36.                                 //假设第一个老师的当前预测是正确的,那么需要进行判断。
  37.                                 boolean b = hanshu(0,y,str);
  38.                                 //如果b是真的,那么就需要将所有的地方都进行一次判断。
  39.                                 //因为还有可能存在别的相矛盾的预测。
  40.                                 if(b){
  41.                                         k:for(int m = 1;m<3;m++){//第一个老师的正确预测已经假设过了,所以不需要从0开始。
  42.                                                 for(int n = 1;n<5;n++)
  43.                                                         if(str[m][n]!=null){
  44.                                                                 b = b&&hanshu(m,n,str);
  45.                                                                 if(!b)//如果某个预测出现了错误,那么就直接跳出循环即可。
  46.                                                                         break k;//跳出最外层,因为这个假设不对。
  47.                                                         }
  48.                                         }
  49.                                 }
  50.                                 if(b){//如果当前假设成立,那么遍历输出相应的结果。
  51.                                         for(int x1 = 0;x1<3;x1++){
  52.                                                 for(int y1 = 1;y1<5;y1++){
  53.                                                         if(str[x1][y1]!=null)
  54.                                                                 System.out.println(str[x1][y1]+"是第"+y1+"名");
  55.                                                 }
  56.                                         }
  57.                                 }
  58.                                 else{
  59.                                         if(y == 4){//当第一个老师的所有预测都是错误的时候,题目就无法完成了。
  60.                                                 System.out.println("无法推断出名次。");
  61.                                                 break;
  62.                                         }
  63.                                         str = fu(bei,str);//通过上面的操作,已经将str进行了改变,所以需要还原。
  64.                                 }
  65.                         }
  66.         }
  67.         //改变同行、同列以及相同的人后,判断是不是出现错误。
  68.         private static boolean hanshu(int col, int row, String[][] str) {
  69.                 boolean b= false;
  70.                 for(int x = 0;x<3;x++){
  71.                         for(int y = 1;y<5;y++){
  72.                                 b= false;//每一个位置开始时假设没有发生变化。
  73.                                 if(str[x][y]!=null){
  74.                                         if(x == col&&y!=row){//同行不同列
  75.                                                 str[x][y] = null;
  76.                                                 b = true;
  77.                                         }
  78.                                         else if( y == row&&x!=col){//同列不同行
  79.                                                 str[x][y] = null;
  80.                                                 b = true;
  81.                                         }
  82.                                         else if(str[x][y].equals(str[col][row])&&x!=col&&y!=row){//即不同列也不同行,但是预测的人是一样的。
  83.                                                 str[x][y] = null;
  84.                                                 b = true;
  85.                                         }
  86.                                         if(b){//如果该位置发生了变化,那么就将它所在的行的预测数减1.
  87.                                                 str[x][0] = Integer.parseInt(str[x][0])-1+"";
  88.                                                 if(str[x][0].equals("0"))
  89.                                                         return false;
  90.                                         }
  91.                                 }
  92.                         }                               
  93.                 }
  94.                 return true;
  95.         }
  96.         //将String[][]还原。
  97.         private static String[][] fu(String[][] o,String[][] b){
  98.                 for(int x = 0;x<o.length;x++)
  99.                         for(int y = 0;y<o[x].length;y++)
  100.                                 b[x][y] = o[x][y];
  101.                 return b;
  102.                
  103.         }
  104. }
复制代码

点评

赞一个  发表于 2013-6-3 19:07

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马