亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bankcodescan.java

?? 湖南第一屆程序設計大賽 第七題試題+源碼
?? JAVA
字號:
package com.xnulw.pro7;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
 * @author slmcygh
 * 吐血,中午11點多開始思考這個題目,到現在已經是晚上11:50了,頭暈腦脹的
 * 現在代碼已經是很亂了,其實思路并不復雜,實現起來也不困難,可就是有些細節問題你很難發現,要經過大量的
 * 調試,然后再慢慢的修改。我現在懷疑還有膽量再做
 * 
 * 歡迎大家轉載,但請保留以上文字
 * 同時歡迎大家訪問我的博客 http://xnulw.blogcn.com
 *
 */
//條形碼元數據,即其中的某一位
class CodeData{
	char[][] ch=new char[3][3];//記錄某一個數值的七段表示
	int dataValue;	//相應的數值
	public CodeData(){
		dataValue=0;
		for(int i=0;i<3;i++)
			for(int j=0;j<3;j++)
				ch[i][j]='.';
	}
	public CodeData(int value,String firstline,String secondline,String thirdline){
		dataValue=value;
		ch[0]=firstline.toCharArray();
		ch[1]=secondline.toCharArray();
		ch[2]=thirdline.toCharArray();
	}
}
public class BankCodeScan {
	private CodeData[] codeDictionary;//十種可能的元數據,可稱做字典
	CodeData[] dataTmps=new CodeData[9];
	private CodeData[] theCode=new CodeData[9];//某一個條形碼,是由9個元數據組成的
	private int notEqualNum;//記錄條形碼中元數據不在字典中的個數,這里的值不會大于1,當大于1時即已經表明這個條形碼是不可識別的
	private int notEqualInTheCode;//記錄不在字典中的元數據在條形碼的位置,只有當notEqualNum=1時才有含義,主要目標是為了后面的近似匹配
	private BufferedReader inStream;
	
	public BankCodeScan(){
		try {
			inStream=new BufferedReader(new FileReader("input.txt"));
		} catch (FileNotFoundException e) {
			// TODO 自動生成 catch 塊
			e.printStackTrace();
		}
	}
	//字典初始化
	public void initDictionary(){
		
		codeDictionary=new CodeData[10];
		for(int i=0;i<10;i++){
			codeDictionary[i]=new CodeData();
			}
		
			
		char[][] dat0={ 
				{'.','_','.'},				
				{'|','.','|'},						 
				{'|','_','|'}
				};
		char[][] dat1={ 
				{'.','.','.'},				
				{'.','.','|'},						 
				{'.','.','|'}
				};
		char[][] dat2={ 
				{'.','_','.'},				
				{'.','_','|'},						 
				{'|','_','.'}
				};
		char[][] dat3={ 
				{'.','_','.'},				
				{'.','_','|'},						 
				{'.','_','|'}
				};
		char[][] dat4={ 
				{'.','.','.'},				
				{'|','_','|'},						 
				{'.','.','|'}
				};
		char[][] dat5={ 
				{'.','_','.'},				
				{'|','_','.'},						 
				{'.','_','|'}
				};
		char[][] dat6={ 
				{'.','_','.'},				
				{'|','_','.'},						 
				{'|','_','|'}
				};
		char[][] dat7={ 
				{'.','_','.'},				
				{'.','.','|'},						 
				{'.','.','|'}
				};
		char[][] dat8={ 
				{'.','_','.'},				
				{'|','_','|'},						 
				{'|','_','|'}
				};
		char[][] dat9={ 
				{'.','_','.'},				
				{'|','_','|'},						 
				{'.','_','|'}
				};
		codeDictionary[0].ch=dat0;
		codeDictionary[0].dataValue=0;
		codeDictionary[1].ch=dat1;
		codeDictionary[1].dataValue=1;
		codeDictionary[2].ch=dat2;
		codeDictionary[2].dataValue=2;
		codeDictionary[3].ch=dat3;
		codeDictionary[3].dataValue=3;
		codeDictionary[4].ch=dat4;
		codeDictionary[4].dataValue=4;
		codeDictionary[5].ch=dat5;
		codeDictionary[5].dataValue=5;
		codeDictionary[6].ch=dat6;
		codeDictionary[6].dataValue=6;
		codeDictionary[7].ch=dat7;
		codeDictionary[7].dataValue=7;
		codeDictionary[8].ch=dat8;
		codeDictionary[8].dataValue=8;
		codeDictionary[9].ch=dat9;
		codeDictionary[9].dataValue=9;
		
	}

	
	//這個方法主要是用于判斷當前元數據是否在字典中
	public void equalJudge(CodeData[] theData,int theMetadataPosition){
		int ntoEqualNumTag=0;//用于標識現在的元數據與字典中元數據都不相等的個數,如果等于10,則說明當前元數據不能在字典中找到
		for(int num=0;num<10;num++){
			int tag=ntoEqualNumTag;//tag主要用于判定當前元數據與字典中第num個元素是否相等
			for(int i=-1;i<=1;i++)	{
				if(tag==(ntoEqualNumTag-1))break;//如果有小部分不相等,則其它部分沒必要比較,這個設計我覺得非常酷
				for(int j=-1;j<=1;j++)		
					if(!((i==-1 && j==-1)||(i==-1 && j==1)))										
							if(theData[theMetadataPosition].ch[i+1][j+1]!=codeDictionary[num].ch[i+1][j+1]){
								ntoEqualNumTag++;//不等標記加1,當值為10時,則說明字典中沒有與之相等的元素
								break;
							}
			}
			
			//比較一個元素,每小部分均相等,則整體相等
			//下面是為條型碼中的第theMetadataPosition+1個數據賦值
			if(tag==ntoEqualNumTag){
				theData[theMetadataPosition].dataValue=codeDictionary[num].dataValue;
				break;
			}
		
		}
		if(ntoEqualNumTag==10){
			notEqualNum++;//條形碼不在字典中的元數據加1
			notEqualInTheCode=theMetadataPosition;//記錄最后一個不在字典中的無數據的位置
		}
	}
	//這個方法是在確定了整個條形碼中只有一個元數據不確定時調用的匹配方法
	//這里說的匹配不指相等,而是條形碼中的一個元數據指可以添加一些筆畫變成與字典中元素相等
	public String isLikeJudge(CodeData[] theData,int notEqualInTheCode){	
		int notLikeTag=0;
		int likeTag=0;//記錄可匹配的元數據個數
		for(int num=0;num<10;num++){
			int tag2=notLikeTag;//tag2主要用于判定當前元數據與字典中第num個元素是否可匹配
			for(int i=-1;i<=1;i++){
				if(tag2==(notLikeTag-1))break;//如果有小部分不匹配,則其它部分沒必要比較,這個設計我覺得非常酷
				for(int j=-1;j<=1;j++)
					if(!((i==-1 && j==-1)||(i==-1 && j==1)))					
						if(theData[notEqualInTheCode].ch[i+1][j+1]!=codeDictionary[num].ch[i+1][j+1]){
							if(theData[notEqualInTheCode].ch[i+1][j+1]!='.'){
								notLikeTag++;//不匹配加1
								break;
							}
							
						}
			}
			
			//相等,則說明當前條形碼中的元數據是可以匹配的,但還不確定匹配后的結果是否滿足較驗條件
			if(tag2==notLikeTag){
				int temp=theData[notEqualInTheCode].dataValue;//保存數值,一旦匹配的結果不滿足較驗條件,便于恢復
				theData[notEqualInTheCode].dataValue=codeDictionary[num].dataValue;//改變數據
				if(validata())likeTag++;
				else
					theData[notEqualInTheCode].dataValue=temp;//恢復數據
			}
		
		}
		
		if(likeTag==0)return "failur";	//不可匹配	
		if(likeTag==1)return display();//當前元數據只可匹配一個字典中的數據
		if(likeTag>1)return"ambiguou";//當前元數據可匹配多個字典中的數據
		return null;
	}
	
	//對識別出來的條形碼,讀取其值
	private String display() {		
		String str="";		
		for(int i=0;i<9;i++){
			str+=theCode[i].dataValue;
		
		}
		
		//這里很重要,主要是讓條形碼還原最初掃描進來的狀態
		//因為,后面有可能多次對同一個條形碼進行操作,而這些操作要求條形碼具有最初的狀態
		for(int i=0;i<9;i++){
		this.theCode[i]=new CodeData(dataTmps[i].dataValue,new String(dataTmps[i].ch[0]),
				new String(dataTmps[i].ch[1]),new String(dataTmps[i].ch[2]));
		}
		
		return str;
		
	}
	
	//條形碼掃描結果進行驗證
	private boolean validata() {
		int sum=0;
		for(int i=1;i<10;i++){
			int tmp=(10-i)*theCode[i-1].dataValue;
			sum+=tmp;
		}
		if((sum%11)==0)return true;
		return false;
	}
	
	//對某一條具體的條形碼進行處理
	public void processACode(){
		for(int i=0;i<9;i++){
			//題目說過,掃描只可能最多出錯一個數據
			if(notEqualNum>1){
				System.out.println("failur");
				break;
			}
			equalJudge(theCode, i);//檢查條形碼第(i+1)個數據是否在字典中
		}
		
		//這里就是當條形碼所有的數據都在字典中,即可識別時
		//這里比較復雜,因為可識別的數據同樣是可以是某個數據因為掃描錯誤而得到,如7->1,8->0等
		if(notEqualNum==0){
			//1.這里不僅要考慮識別出的條形碼是否滿足較驗條件,
			//2.同時又要考慮這些可識別的條形碼是否是別的條形碼因為掃描錯誤而得到
			//最后結果只可能是3種情況,(1)都不滿足(2)有多個滿足(3)只有一個滿足
			//結合1,2兩種情況,可以很容易的構建整個綜合結果的邏輯
			
			String result="";//用于保存綜合兩種考慮的輸出結果
			String s1="";//用于保存考慮1的輸出結果
			if(this.validata()){
				s1=display();
			}else{
				s1="failur";
			}
			
			int num=0;
			String s2="failur";//用于保存考慮2的輸出結果
			for(int i=0;i<9;i++){		
				// 這里因為,每一次元數據替代后就改變了原先條形碼,因此這里要保證的是每一次替代后,又還原為原先的條形碼
				// 而這個操作,我們在display()方法中做了
				String s2temp=this.isLikeJudge(theCode, i);
				if("ambiguou".equals(s2temp)){
					s2="ambiguou";
					break;
				}
				else{
					if(!"failur".equals(s2temp)){
						if(!s2.equals(s2temp)){							
							s2=s2temp;
							num++;
							if(num>1){
								s2="ambiguou";
								break;
							}
						}
					}
				}
				
			}
			
			if("ambiguou".equals(s2)){
				result=s2;
			}else{
				if("failur".equals(s2)){
					if("failur".equals(s1)){
						result="failur";
					}else{
						result=s1;
					}
				}else{
					if("failur".equals(s1)){
						result=s2;
					}else{
						if(s2.equals(s1)){
							result=s2;
						}else{
							result="ambiguou";
						}
					}
				}
			}
			
			System.out.println(result);
			
			
		}
		//有一個數據不可識別,notEqualInTheCode指明了該數據在條形碼中的位置是(notEqualInTheCode+1)
		//匹配該數據
		if(notEqualNum==1)System.out.println(isLikeJudge(theCode, notEqualInTheCode));
	}
	
	//驅動類,出于習慣把正常的操作步驟組織在這個方法里
	public void driver() throws IOException{
		String firstline;
		String secondline;
		String thirdline;
		//循環讀取條形碼并進行處理
		while((firstline=inStream.readLine())!=null){
			if((secondline=inStream.readLine())!=null && (thirdline=inStream.readLine())!=null){
				for(int i=0;i<9;i++){
					theCode[i]=new CodeData(0,firstline.substring(i*3, (i+1)*3),
							secondline.substring(i*3, (i+1)*3),
							thirdline.substring(i*3, (i+1)*3));
				}

				//這里就是把條形碼的最初狀態作一個備份,以便需要的時候,還原其初始狀態
				for(int i=0;i<9;i++){
					dataTmps[i]=new CodeData(theCode[i].dataValue,new String(theCode[i].ch[0]),
							new String(theCode[i].ch[1]),new String(theCode[i].ch[2]));
				}
			}
			processACode();//處理這一條條形碼
			this.notEqualNum=0;//恢復狀態,為處理下一條條形碼作準備
			this.notEqualInTheCode=0;

		}
	}	
	public static void main(String[] args) throws IOException{
		BankCodeScan bc=new BankCodeScan();
		bc.initDictionary();
		bc.driver();
	}
	
}




















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产69精品久久久久毛片| 亚洲成人动漫在线免费观看| 日韩一级片在线播放| 欧美亚洲国产一区二区三区va | 色婷婷国产精品| 91影院在线免费观看| caoporn国产一区二区| 成人午夜私人影院| 91网页版在线| 日本久久一区二区三区| 在线精品国精品国产尤物884a| 色综合色综合色综合| 色噜噜狠狠色综合欧洲selulu| 色av一区二区| 欧美电影一区二区| 欧美一卡在线观看| 久久影院电视剧免费观看| 久久夜色精品国产噜噜av| 亚洲国产精品二十页| 综合电影一区二区三区| 亚洲一区二区精品久久av| 日韩精品免费专区| 韩国毛片一区二区三区| 国v精品久久久网| 91国内精品野花午夜精品| 欧美嫩在线观看| 久久综合色鬼综合色| 一色桃子久久精品亚洲| 亚洲一区在线免费观看| 久久成人综合网| av日韩在线网站| 69堂成人精品免费视频| 久久久久国产精品麻豆ai换脸 | 蜜桃久久精品一区二区| 国产一区二区三区美女| 日本韩国一区二区三区| 日韩女优av电影在线观看| 国产精品人成在线观看免费| 亚洲影视在线播放| 国产精品99久久久久久似苏梦涵| 91蝌蚪国产九色| 日韩欧美国产综合| 亚洲欧美国产三级| 狠狠色综合日日| 色婷婷av一区二区| 久久久精品中文字幕麻豆发布| 亚洲欧美日韩中文字幕一区二区三区 | 一区二区三区中文在线观看| 美女网站视频久久| 色欧美日韩亚洲| 国产欧美一区二区在线| 图片区日韩欧美亚洲| 99国产精品久| 久久婷婷国产综合精品青草| 丝袜诱惑亚洲看片| 色综合久久综合| 欧美韩国日本综合| 国内精品久久久久影院一蜜桃| 欧美日韩在线三区| 亚洲欧美激情插| av在线免费不卡| 国产欧美精品一区二区色综合朱莉 | 亚洲精品日韩专区silk| 福利视频网站一区二区三区| 欧美va亚洲va| 麻豆91精品91久久久的内涵| 欧美亚洲国产怡红院影院| 亚洲欧美视频在线观看| 91视频免费播放| 亚洲视频图片小说| 99视频精品在线| 国产精品久久久久永久免费观看 | 一个色在线综合| 91免费视频大全| 中文字幕亚洲精品在线观看| 国产成人综合在线观看| 久久精品人人做人人爽人人| 激情图片小说一区| www激情久久| 精品一区二区日韩| 久久免费的精品国产v∧| 国产一区二区免费看| 久久久久久久网| 国产aⅴ精品一区二区三区色成熟| 亚洲精品在线免费观看视频| 国产伦精品一区二区三区视频青涩| 欧美大片在线观看一区| 国产精品正在播放| 国产精品理论片| 在线亚洲一区二区| 亚洲高清不卡在线| 日韩一级大片在线观看| 国产一区二区91| 国产拍揄自揄精品视频麻豆| 91偷拍与自偷拍精品| 亚洲综合在线观看视频| 制服丝袜在线91| 国产在线国偷精品产拍免费yy| 久久亚洲一区二区三区四区| 成人免费电影视频| 亚洲一区在线观看网站| 欧美一级理论性理论a| 国产一区二区日韩精品| 1区2区3区国产精品| 欧美日韩一区二区欧美激情| 麻豆免费看一区二区三区| 国产欧美一区二区精品性色 | 69堂成人精品免费视频| 国产99一区视频免费| 一卡二卡三卡日韩欧美| 精品久久久久99| 色综合网站在线| 久久99九九99精品| 亚洲欧美日韩国产综合| 日韩欧美一二三四区| 成人精品国产一区二区4080| 精品第一国产综合精品aⅴ| 91视频com| 中文字幕亚洲视频| 欧美成人精品二区三区99精品| 成人av资源在线| 爽好多水快深点欧美视频| 欧美高清在线精品一区| 91精品在线一区二区| 成+人+亚洲+综合天堂| 日韩av在线发布| 亚洲免费观看在线视频| 久久这里只有精品首页| 欧美日韩视频在线一区二区| 成人在线一区二区三区| 麻豆国产精品官网| 曰韩精品一区二区| 欧美国产欧美综合| 欧美mv日韩mv国产网站| 欧美日韩国产综合视频在线观看| 大胆欧美人体老妇| 国产在线国偷精品免费看| 日本女人一区二区三区| 亚洲电影第三页| 亚洲女同一区二区| 亚洲国产激情av| 久久色.com| 精品国产三级电影在线观看| 制服丝袜在线91| 欧美日韩免费不卡视频一区二区三区| 不卡一区中文字幕| 成人福利视频在线看| 国产一区二区三区最好精华液| 免费欧美在线视频| 久久精品噜噜噜成人88aⅴ| 日韩精品每日更新| 午夜精品久久久久久久 | 亚洲人午夜精品天堂一二香蕉| 国产婷婷色一区二区三区 | 成人午夜激情片| 丰满亚洲少妇av| 成人黄页毛片网站| caoporm超碰国产精品| caoporen国产精品视频| 91在线精品秘密一区二区| 99久久免费精品高清特色大片| 成人夜色视频网站在线观看| 国产91在线观看| 成人免费毛片高清视频| av高清不卡在线| 欧美性xxxxx极品少妇| 欧美日韩电影在线| 日韩亚洲欧美在线观看| 欧美成人精精品一区二区频| 久久综合久久综合九色| 中文字幕不卡在线播放| 亚洲天堂久久久久久久| 亚洲成人自拍网| 久久国产成人午夜av影院| 成人黄页在线观看| 欧美精品v国产精品v日韩精品 | 国产福利一区二区三区视频在线| 国产精品1024| 色综合久久88色综合天天 | 国产成人免费视| 91亚洲精华国产精华精华液| 欧美日本韩国一区二区三区视频| 7777女厕盗摄久久久| 精品伦理精品一区| 国产精品欧美一区喷水| 亚洲成va人在线观看| 国产一区二区三区四区五区入口| 91免费在线播放| 欧美www视频| 亚洲视频综合在线| 青椒成人免费视频| 99久久99久久精品免费观看| 91超碰这里只有精品国产| 日本一区二区三区在线不卡| 亚洲精品国产视频| 国产一区二区三区四区在线观看| 91久久精品一区二区二区| 久久丝袜美腿综合| 视频一区欧美日韩| av不卡在线观看|