java逻辑编程题_用Java编程解决一道逻辑推理题
package mytest;
import java.util.Scanner;
public class Test14 {
/**
* 競賽結果表明,他們都說對了一半,說錯了一半,并且無并列名次,試編程輸出a,b,c,d的各個名次。
* 分析:
* 我們將老師的預測列成二維數組形式。行數是老師的人數,也就是3.列數為5。
* 第一列表示該老師預測對的個數。由于一個老師預測了兩部分,所以將初始值都設置為2.
* 我們首先假設第一個老師的第一部分預測時對的,那么就需要將預測了同一人,預測了同一名次,
* 以及第一個老師的另一部分預測全部設置為null,并且將相應的預測數減1.直到某一個預測數為0時,
* 那么這個假設就是錯誤的。
* @param args
*/
public static void main(String[] args) {
String[][] str = new String[3][5];
for(int x = 0;x<3;x++){
str[x][0] = 2+"";
}
System.out.println("注意:輸入時人與名次用等號連接,人與人之間用逗號隔開。");
for(int x = 1;x<=3;x++){
System.out.print("請輸入第"+x+"個老師的預測:");
Scanner sc = new Scanner(System.in);
String a = sc.next();
int firstd = a.indexOf("=");
int lastd = a.lastIndexOf("=");
int dou = a.indexOf(",");
str[x-1][Integer.parseInt(a.substring(firstd+1,dou))] = a.substring(0, firstd);
str[x-1][Integer.parseInt(a.substring(lastd+1))] = a.substring(dou+1, lastd);
}
String[][] bei = new String[3][5];//將數組備份,方便還原。
bei= fu(str,bei);
//由于第一個老師肯定會預測對一個,所以不需要進行行的遍歷。
for(int y = 1;y<5;y++){
if(str[0][y] == null)
continue;
//假設第一個老師的當前預測是正確的,那么需要進行判斷。
boolean b = hanshu(0,y,str);
//如果b是真的,那么就需要將所有的地方都進行一次判斷。
//因為還有可能存在別的相矛盾的預測。
if(b){
k:for(int m = 1;m<3;m++){//第一個老師的正確預測已經假設過了,所以不需要從0開始。
for(int n = 1;n<5;n++)
if(str[m][n]!=null){
b = b&&hanshu(m,n,str);
if(!b)//如果某個預測出現了錯誤,那么就直接跳出循環即可。
break k;//跳出最外層,因為這個假設不對。
}
}
}
if(b){//如果當前假設成立,那么遍歷輸出相應的結果。
for(int x1 = 0;x1<3;x1++){
for(int y1 = 1;y1<5;y1++){
if(str[x1][y1]!=null)
System.out.println(str[x1][y1]+"是第"+y1+"名");
}
}
}
else{
if(y == 4){//當第一個老師的所有預測都是錯誤的時候,題目就無法完成了。
System.out.println("無法推斷出名次。");
break;
}
str = fu(bei,str);//通過上面的操作,已經將str進行了改變,所以需要還原。
}
}
}
//改變同行、同列以及相同的人后,判斷是不是出現錯誤。
private static boolean hanshu(int col, int row, String[][] str) {
boolean b= false;
for(int x = 0;x<3;x++){
for(int y = 1;y<5;y++){
b= false;//每一個位置開始時假設沒有發生變化。
if(str[x][y]!=null){
if(x == col&&y!=row){//同行不同列
str[x][y] = null;
b = true;
}
else if( y == row&&x!=col){//同列不同行
str[x][y] = null;
b = true;
}
else if(str[x][y].equals(str[col][row])&&x!=col&&y!=row){//即不同列也不同行,但是預測的人是一樣的。
str[x][y] = null;
b = true;
}
if(b){//如果該位置發生了變化,那么就將它所在的行的預測數減1.
str[x][0] = Integer.parseInt(str[x][0])-1+"";
if(str[x][0].equals("0"))
return false;
}
}
}
}
return true;
}
//將String[][]還原。
private static String[][] fu(String[][] o,String[][] b){
for(int x = 0;x
for(int y = 0;y
b[x][y] = o[x][y];
return b;
}
}
總結
以上是生活随笔為你收集整理的java逻辑编程题_用Java编程解决一道逻辑推理题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ENSP配置 实例二 单臂路由配置
- 下一篇: mysql 导入日期 0000_解决Ex