sudoku.java
来自「Semantic Web Ontology Editor」· Java 代码 · 共 1,029 行 · 第 1/3 页
JAVA
1,029 行
String val = "#"+String.valueOf((int) Math.pow(i,2));
if (this.useIndividuals && gridOnt.getIndividual(new URI(SUDOKU_NS+val))!=null) {
num = (int) Math.pow(i,2);
break;
}
if (!this.useIndividuals && gridOnt.getClass(new URI(SUDOKU_NS+val))!=null) {
num = (int) Math.pow(i,2);
break;
}
}
if (dimen!=num) {
this.dimen = num;
this.subdim = (int) Math.sqrt(dimen);
this.getContentPane().removeAll();
this.setupUI();
this.repaint();
}
// populate table
SwoopToldReasoner reas = new SwoopToldReasoner();
reas.setOntology(gridOnt);
for (int g=1; g<=dimen; g++) {
for (int i=1; i<=subdim; i++) {
for (int j=1; j<=subdim; j++) {
OWLEntity ent = null;
String val = "";
if (this.useIndividuals) {
String cell = "#V"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
ent = gridOnt.getIndividual(new URI(SUDOKU_NS+cell));
}
else {
String cell = "#C"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
ent = gridOnt.getClass(new URI(SUDOKU_NS+cell));
}
if (ent==null) {
JOptionPane.showMessageDialog(this, "Error: Invalid Grid Dimensions", "Load Error", JOptionPane.ERROR_MESSAGE);
return;
}
else {
// get value
Set equ = new HashSet();
if (this.useIndividuals) equ = reas.getSameAsIndividuals((OWLIndividual) ent);
else equ = reas.equivalentClassesOf((OWLClass) ent);
for (Iterator iter = equ.iterator(); iter.hasNext();) {
OWLEntity eq = (OWLEntity) iter.next();
if (eq.getURI().toString().indexOf("#V")==-1 && eq.getURI().toString().indexOf("#C")==-1 && eq.getURI().toString().indexOf("#T")==-1) {
val = eq.getURI().toString();
val = val.substring(val.indexOf("#")+1, val.length());
break;
}
}
}
// map g,i,j to row,col
int row = ((g - 1) / subdim) * subdim + i;
int c = g % subdim;
if (c==0) c = subdim;
int col = (c-1) * subdim + j;
table.setValueAt(val, row-1, col-1);
}
}
}
table.updateUI();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
private void saveOWLGrid() {
try {
JFileChooser wrapChooser = new JFileChooser();
File saveFile = null;
int returnVal = wrapChooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
saveFile = wrapChooser.getSelectedFile();
} else { // save cancelled
return;
}
// prompt user if overwriting
if (saveFile.exists()) {
int result = JOptionPane.showConfirmDialog(this, "Saving File at " + saveFile.getAbsolutePath() + ". Overwrite?", "Save Ontology", JOptionPane.YES_NO_OPTION);
if (result != JOptionPane.YES_OPTION) return;
}
// write ontology file
FileWriter fw = new FileWriter(saveFile);
this.generatePopulatedSudokuOWLGrid();
fw.write(this.getRDFXMLGridOnt());
fw.close();
System.out.println("Saved grid to file: "+saveFile.getName());
JOptionPane.showMessageDialog(this, "Saved grid to file: "+saveFile.getName(), "Saving Sudoko OWL Ontology", JOptionPane.INFORMATION_MESSAGE);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
private void popupExplanation(int row, int col) {
try {
// translate dimensions to to g, i, j
int g = ((row-1) / subdim) * subdim + 1 + ((int) (col-1) / subdim);
int i = row % subdim;
if (i==0) i = subdim;
int j = col % subdim;
if (j==0) j = subdim;
String val = table.getValueAt(row-1, col-1).toString();
if (!val.equals("") && this.useIndividuals) {
// Cg_ij has instance value
// get explanation
ConciseFormatEntityRenderer cfRend = new ConciseFormatEntityRenderer(); // swoopHandler.termDisplay.renderers.get(0);
cfRend.setSwoopModel(swoopModel);
cfRend.visitor = cfRend.createVisitor();
OWLIndividual ind = gridOnt.getIndividual(new URI(SUDOKU_NS+"#"+val));
OWLClass cla = gridOnt.getClass(new URI(SUDOKU_NS+"#C"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j)));
String expl = cfRend.getSudokuExplanation(gridOnt, ind, cla);
String nlExpl = "<html><body><font face=\"Verdana\" size=2>";
nlExpl += "<b>Cell ("+row+","+col+")</b> has value <b>"+val+"</b> because...<br><hr><font face=\"Verdana\" size=2>";
nlExpl += "Each cell must have <b>one of</b> the values [1..."+String.valueOf(dimen)+"] <i>[constraint]</i><br>";
List nlList = new ArrayList();
// parse explanation to add NL
String[] st = expl.split("<br>");
for (int s=0; s<st.length; s++) {
String line = st[s];
String nl = "";
// System.out.println(line);
if (line.indexOf("SameIndividual")>=0) {
String token = "\">";
int pos = line.indexOf(token)+2;
String val1 = line.substring(pos, line.indexOf("<", pos));
int pos2 = line.indexOf(token, pos)+2;
String val2 = line.substring(pos2, line.indexOf("<", pos2));
if (val2.indexOf("V")>=0) {
String temp = val1;
val1 = val2;
val2 = temp;
}
String gs = val1.substring(1,2);
String is = val1.substring(3,4);
String js = val1.substring(4,5);
g = Integer.parseInt(gs);
i = Integer.parseInt(is);
j = Integer.parseInt(js);
row = ((g - 1) / subdim) * subdim + i;
int c = g % subdim;
if (c==0) c = subdim;
col = (c-1) * subdim + j;
nl = "<b>Cell ("+row+","+col+")</b> has value "+val2 + " <i>[given]</i>";
}
else {
// check grid
for (g=1; g<=dimen; g++) {
boolean match = true;
for (i=1; i<=subdim; i++) {
for (j=1; j<=subdim; j++) {
String cell = "V"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
if (line.indexOf(cell)==-1) {
match = false;
break;
}
}
}
if (match) {
nl = "<b>Grid "+String.valueOf(g)+"</b> must have all values different <i>[constraint]</i>";
break;
}
}
if (nl.equals("")) {
// check row
for (g=1; g<=dimen; g+=subdim) {
for (i=1; i<=subdim; i++) {
boolean match = true;
for (int sg=g; sg<=(g+subdim-1); sg++) {
for (j=1; j<=subdim; j++) {
String cell = "V"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
if (line.indexOf(cell)==-1) {
match = false;
break;
}
}
}
if (match) {
row = ((g - 1) / subdim) * subdim + i;
nl = "<b>Row "+row+"</b> must have all values different <i>[constraint]</i>";
break;
}
}
}
}
if (nl.equals("")) {
// check columns
for (g=1; g<=subdim; g++) {
for (j=1; j<=subdim; j++) {
boolean match = true;
for (int sg=g; sg<=dimen; sg+=subdim) {
for (i=1; i<=subdim; i++) {
String cell = "V"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
if (line.indexOf(cell)==-1) {
match = false;
break;
}
}
}
if (match) {
int c = g % subdim;
if (c==0) c = subdim;
col = (c-1) * subdim + j;
nl = "<b>Column "+col+"</b> must have all values different <i>[constraint]</i>";
break;
}
}
}
}
}
// System.out.println("--->"+nl);
if (!nl.equals("")) nlList.add(nl); //nlExpl += nl+"<br>";
}
// post process to *order* NL
while (!nlList.isEmpty()) {
boolean findVal = false;
String valLine = "";
for (Iterator iter = nlList.iterator(); iter.hasNext();) {
String line = (String) iter.next();
if (line.indexOf("has value")>=0) {
findVal = true;
valLine = line;
break;
}
}
if (findVal) {
nlList.remove(valLine);
// add findVal to output
nlExpl += valLine + "<br>";
String rs = valLine.substring(valLine.indexOf("(")+1, valLine.indexOf(","));
String cs = valLine.substring(valLine.indexOf(",")+1, valLine.indexOf(")"));
row = Integer.parseInt(rs);
col = Integer.parseInt(cs);
// add all grid/row/col constraints after this line
for (Iterator iter = new ArrayList(nlList).iterator(); iter.hasNext();) {
String line = (String) iter.next();
boolean match = false;
if (line.indexOf("Grid")>=0) {
int pos = line.indexOf("Grid")+5;
String gs = line.substring(pos, line.indexOf("</b>")).trim();
g = Integer.parseInt(gs);
// check if row,col appear in g
if (g == ((row-1) / subdim) * subdim + 1 + ((int) (col-1) / subdim)) match = true;
}
else if (line.indexOf("Row")>=0) {
int pos = line.indexOf("Row")+4;
String is = line.substring(pos, line.indexOf("</b>")).trim();
i = Integer.parseInt(is);
// check if i matches
if (i==row) match = true;
}
else if (line.indexOf("Column")>=0) {
int pos = line.indexOf("Column")+7;
String js = line.substring(pos, line.indexOf("</b>")).trim();
j = Integer.parseInt(js);
// check if j matches
if (col==j) match = true;
}
if (match) {
nlExpl += "|_" + line + "<br>";
nlList.remove(line);
}
}
}
else {
// flush remaining constraints
for (Iterator iter = nlList.iterator(); iter.hasNext();) {
String line = (String) iter.next();
nlExpl += line + "<br>";
}
nlList.clear();
}
}
nlExpl += "</body></html>";
// display explanation in popup
JFrame popup = new JFrame("Explanation");
Container content = popup.getContentPane();
content.setLayout(new GridLayout(1,1));
JEditorPane htmlPane = new JEditorPane();
htmlPane.setEditable(false);
htmlPane.setContentType("text/html");
htmlPane.setText(nlExpl);
htmlPane.setCaretPosition(0);
content.add(new JScrollPane(htmlPane));
popup.setSize(400, 200);
popup.setLocation(300, 300);
popup.show();
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void mouseClicked(MouseEvent e) {
if (e.getSource() == table) {
if (e.getButton() == MouseEvent.BUTTON3) {
// popup menu on right click
int row = table.rowAtPoint(e.getPoint());
int col = table.columnAtPoint(e.getPoint());
this.popupExplanation(row+1, col+1);
}
}
}
public void mousePressed(MouseEvent arg0) {
}
public void mouseReleased(MouseEvent arg0) {
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
private void changeDimensions() {
String result = JOptionPane.showInputDialog(this, "Specify New Dimensions", "Puzzle Grid", JOptionPane.INFORMATION_MESSAGE);
if (result!=null) {
int num = Integer.parseInt(result);
if (Math.sqrt(num) != ((int) Math.sqrt(num))) {
JOptionPane.showMessageDialog(this, "Error: Invalid Grid Dimensions - Number needs to be a perfect square", "Dimension Error", JOptionPane.ERROR_MESSAGE);
return;
}
this.dimen = num;
this.subdim = (int) Math.sqrt(dimen);
this.getContentPane().removeAll();
this.setupUI();
this.repaint();
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?