sudoku breaker-java edition
Deducer class:
puzzle.jsp:
1
package puzzle;
2
3
/**
4
* @author
5
* @version 1.0
6
*/
7
public class Deducer
8
{
9
private int[][] array;
10
11
public Deducer(int[][] array)
12
{
13
this.array = new int[9][9];
14
for(int row = 0; row < 9; row++)
15
{
16
for(int column = 0; column < 9; column++)
17
{
18
this.array[row][column] = array[row][column];
19
}
20
}
21
}
22
23
private boolean isFinished()
24
{
25
for(int row = 0; row < 9; row++)
26
{
27
for(int column = 0; column < 9; column++)
28
{
29
if(this.array[row][column] == 0)
30
{
31
return false;
32
}
33
}
34
}
35
return true;
36
}
37
38
public void deduceAll()
39
{
40
if(isFinished())
41
{
42
return;
43
}
44
for(int row = 0; row < 7; row = row + 3)
45
{
46
for(int column = 0; column < 7; column = column + 3)
47
{
48
if(reduceFromOneZone(this.array, row, column))
49
{
50
deduceAll();
51
return;
52
}
53
}
54
}
55
for(int row = 0; row < 9; row++)
56
{
57
if(reduceFromOneRow(this.array, row))
58
{
59
deduceAll();
60
return;
61
}
62
}
63
for(int column = 0; column < 9; column++)
64
{
65
if(reduceFromOneColumn(this.array, column))
66
{
67
deduceAll();
68
return;
69
}
70
}
71
for(int row = 0; row < 7; row = row + 3)
72
{
73
if(reduceFromThreeRows(this.array, row, row + 2))
74
{
75
deduceAll();
76
return;
77
}
78
}
79
for(int column = 0; column < 7; column = column + 3)
80
{
81
if(reduceFromThreeColumns(this.array, column, column + 2))
82
{
83
deduceAll();
84
return;
85
}
86
}
87
}
88
89
public void deduceOnce()
90
{
91
for(int row = 0; row < 7; row = row + 3)
92
{
93
for(int column = 0; column < 7; column = column + 3)
94
{
95
if(reduceFromOneZone(this.array, row, column))
96
{
97
return;
98
}
99
}
100
}
101
for(int row = 0; row < 9; row++)
102
{
103
if(reduceFromOneRow(this.array, row))
104
{
105
return;
106
}
107
}
108
for(int column = 0; column < 9; column++)
109
{
110
if(reduceFromOneColumn(this.array, column))
111
{
112
return;
113
}
114
}
115
for(int row = 0; row < 7; row = row + 3)
116
{
117
if(reduceFromThreeRows(this.array, row, row + 2))
118
{
119
return;
120
}
121
}
122
for(int column = 0; column < 7; column = column + 3)
123
{
124
if(reduceFromThreeColumns(this.array, column, column + 2))
125
{
126
return;
127
}
128
}
129
}
130
131
private boolean reduceFromOneZone(int[][] array, int row, int column)
132
{
133
int startRow = (row / 3) * 3;
134
int startColumn = (column / 3) * 3;
135
int[] unknown = new int[9];
136
for(int pointer = 0; pointer < 9; pointer++)
137
{
138
unknown[pointer] = pointer + 1;
139
}
140
for(int rowPointer = startRow; rowPointer < startRow + 3; rowPointer++)
141
{
142
for(int columnPointer = startColumn; columnPointer < startColumn + 3; columnPointer++)
143
{
144
if(array[rowPointer][columnPointer] != 0)
145
{
146
unknown[array[rowPointer][columnPointer] - 1] = 0;
147
}
148
}
149
}
150
for(int digit = 0; digit < 9; digit++)
151
{
152
if(unknown[digit] != 0)
153
{
154
int number = unknown[digit];
155
int posibilities = 0;
156
int rowPosition = -1;
157
int columnPosition = -1;
158
for(int rowPointer = startRow; rowPointer < startRow + 3; rowPointer++)
159
{
160
for(int columnPointer = startColumn; columnPointer < startColumn + 3; columnPointer++)
161
{
162
if(array[rowPointer][columnPointer] == 0)
163
{
164
if(isPossibleInThatCellCheckByColumn(array, number,
165
rowPointer, columnPointer)
166
&& isPossibleInThatCellCheckByRow(array,
167
number, rowPointer, columnPointer))
168
{
169
rowPosition = rowPointer;
170
columnPosition = columnPointer;
171
posibilities++;
172
}
173
}
174
}
175
}
176
if(posibilities == 1)
177
{
178
array[rowPosition][columnPosition] = number;
179
return true;
180
}
181
}
182
}
183
return false;
184
}
185
186
private boolean reduceFromOneRow(int[][] array, int row)
187
{
188
int[] unknown = new int[9];
189
for(int column = 0; column < 9; column++)
190
{
191
unknown[column] = column + 1;
192
}
193
for(int column = 0; column < 9; column++)
194
{
195
if(array[row][column] != 0)
196
{
197
unknown[array[row][column] - 1] = 0;
198
}
199
}
200
for(int column = 0; column < 9; column++)
201
{
202
if(unknown[column] != 0)
203
{
204
int number = unknown[column];
205
int posibilities = 0;
206
int position = -1;
207
for(int pointer = 0; pointer < 9; pointer++)
208
{
209
if(array[row][pointer] == 0)
210
{
211
if(isPossibleInThatCellCheckByColumnAndZone(array,
212
number, row, pointer))
213
{
214
position = pointer;
215
posibilities++;
216
}
217
}
218
}
219
if(posibilities == 1)
220
{
221
array[row][position] = number;
222
return true;
223
}
224
}
225
}
226
return false;
227
}
228
229
private boolean reduceFromOneColumn(int[][] array, int column)
230
{
231
int[] unknown = new int[9];
232
for(int row = 0; row < 9; row++)
233
{
234
unknown[row] = row + 1;
235
}
236
for(int row = 0; row < 9; row++)
237
{
238
if(array[row][column] != 0)
239
{
240
unknown[array[row][column] - 1] = 0;
241
}
242
}
243
for(int row = 0; row < 9; row++)
244
{
245
if(unknown[row] != 0)
246
{
247
int number = unknown[row];
248
int posibilities = 0;
249
int position = -1;
250
for(int pointer = 0; pointer < 9; pointer++)
251
{
252
if(array[pointer][column] == 0)
253
{
254
if(isPossibleInThatCellCheckByRowAndZone(array, number,
255
pointer, column))
256
{
257
position = pointer;
258
posibilities++;
259
}
260
}
261
}
262
if(posibilities == 1)
263
{
264
array[position][column] = number;
265
return true;
266
}
267
}
268
}
269
return false;
270
}
271
272
private boolean isPossibleInThatCellCheckByRowAndZone(int[][] array,
273
int number, int row, int column)
274
{
275
if(!isPossibleInThatCellCheckByRow(array, number, row, column))
276
{
277
return false;
278
}
279
else if(!isPossibleInThatCellCheckByZone(array, number, row, column))
280
{
281
return false;
282
}
283
else if(!canBeInThatZoneCheckByColumn(array, number, row, column))
284
{
285
return false;
286
}
287
else
288
{
289
return true;
290
}
291
}
292
293
private boolean isPossibleInThatCellCheckByColumnAndZone(int[][] array,
294
int number, int row, int column)
295
{
296
if(!isPossibleInThatCellCheckByColumn(array, number, row, column))
297
{
298
return false;
299
}
300
else if(!isPossibleInThatCellCheckByZone(array, number, row, column))
301
{
302
return false;
303
}
304
else if(!canBeInThatZoneCheckByRow(array, number, row, column))
305
{
306
return false;
307
}
308
else
309
{
310
return true;
311
}
312
}
313
314
private boolean canBeInThatZoneCheckByRow(int[][] array, int number,
315
int row, int column)
316
{
317
int startRow = (row / 3) * 3;
318
int startColumn = (column / 3) * 3;
319
for(int rowPointer = startRow; rowPointer < startRow + 3; rowPointer++)
320
{
321
if(rowPointer != row)
322
{
323
if(!isPossibleInThatCellCheckByRow(array, number, rowPointer,
324
column))
325
{
326
continue;
327
}
328
boolean canItBe = true;
329
for(int columnPointer = 0; columnPointer < 9; columnPointer++)
330
{
331
if(columnPointer < startColumn
332
|| columnPointer > startColumn + 2)
333
{
334
if(array[rowPointer][columnPointer] == 0)
335
{
336
if(isPossibleInThatCellCheckByColumn(array, number,
337
rowPointer, columnPointer)
338
&& isPossibleInThatCellCheckByZone(array,
339
number, rowPointer, columnPointer))
340
{
341
canItBe = false;
342
}
343
}
344
}
345
}
346
if(canItBe)
347
{
348
return false;
349
}
350
}
351
}
352
return true;
353
}
354
355
private boolean canBeInThatZoneCheckByColumn(int[][] array, int number,
356
int row, int column)
357
{
358
int startRow = (row / 3) * 3;
359
int startColumn = (column / 3) * 3;
360
for(int columnPointer = startColumn; columnPointer < startColumn + 3; columnPointer++)
361
{
362
if(columnPointer != column)
363
{
364
if(!isPossibleInThatCellCheckByColumn(array, number, row,
365
columnPointer))
366
{
367
continue;
368
}
369
boolean canItBe = true;
370
for(int rowPointer = 0; rowPointer < 9; rowPointer++)
371
{
372
if(rowPointer < startRow || rowPointer > startRow + 2)
373
{
374
if(array[rowPointer][columnPointer] == 0)
375
{
376
if(isPossibleInThatCellCheckByRow(array, number,
377
rowPointer, columnPointer)
378
&& isPossibleInThatCellCheckByZone(array,
379
number, rowPointer, columnPointer))
380
{
381
canItBe = false;
382
}
383
}
384
}
385
}
386
if(canItBe)
387
{
388
return false;
389
}
390
}
391
}
392
return true;
393
}
394
395
private boolean isPossibleInThatCellCheckByZone(int[][] array, int number,
396
int row, int column)
397
{
398
int startRow = (row / 3) * 3;
399
int startColumn = (column / 3) * 3;
400
for(int rowPointer = startRow; rowPointer < startRow + 3; rowPointer++)
401
{
402
for(int columnPointer = startColumn; columnPointer < startColumn + 3; columnPointer++)
403
{
404
if(array[rowPointer][columnPointer] == number)
405
{
406
return false;
407
}
408
}
409
}
410
return true;
411
}
412
413
private boolean reduceFromThreeColumns(int[][] array, int firstColumn,
414
int lastColumn)
415
{
416
int[][] numberAndCount = new int[9][2];
417
int[][] numberAndPosition = new int[27][3];
418
for(int row = 0; row < 9; row++)
419
{
420
numberAndCount[row][0] = row + 1;
421
numberAndCount[row][1] = 0;
422
}
423
for(int row = 0; row < 27; row++)
424
{
425
for(int column = 0; column < 3; column++)
426
{
427
numberAndPosition[row][column] = 0;
428
}
429
}
430
for(int column = firstColumn; column <= lastColumn; column++)
431
{
432
for(int row = 0; row < 9; row++)
433
{
434
if(array[row][column] != 0)
435
{
436
numberAndCount[array[row][column] - 1][1]++;
437
numberAndPosition[9 * (column % 3) + row][0] = array[row][column];
438
numberAndPosition[9 * (column % 3) + row][1] = row;
439
numberAndPosition[9 * (column % 3) + row][2] = column;
440
}
441
}
442
}
443
for(int row = 0; row < 9; row++)
444
{
445
if(numberAndCount[row][1] == 2)
446
{
447
int number = numberAndCount[row][0];
448
int pointer = 0;
449
int firstAppearanceRowPosition = -1;
450
int firstAppearanceColumnPosition = -1;
451
int secondAppearanceRowPosition = -1;
452
int secondAppearanceColumnPosition = -1;
453
while(pointer < 27)
454
{
455
if(numberAndPosition[pointer][0] == number)
456
{
457
firstAppearanceRowPosition = numberAndPosition[pointer][1];
458
firstAppearanceColumnPosition = numberAndPosition[pointer][2];
459
pointer++;
460
break;
461
}
462
else
463
{
464
pointer++;
465
}
466
}
467
while(pointer < 27)
468
{
469
if(numberAndPosition[pointer][0] == number)
470
{
471
secondAppearanceRowPosition = numberAndPosition[pointer][1];
472
secondAppearanceColumnPosition = numberAndPosition[pointer][2];
473
break;
474
}
475
else
476
{
477
pointer++;
478
}
479
}
480
int thirdAppearanceColumnPosition = 3
481
* (firstAppearanceColumnPosition / 3) + 3
482
- firstAppearanceColumnPosition % 3
483
- secondAppearanceColumnPosition % 3;
484
int thirdAppearanceRowStartPosition = (3 - firstAppearanceRowPosition / 3 - secondAppearanceRowPosition / 3) * 3;
485
int posibilities = 0;
486
int thirdAppearanceRowPosition = -1;
487
for(int indicator = thirdAppearanceRowStartPosition; indicator < thirdAppearanceRowStartPosition + 3; indicator++)
488
{
489
if(array[indicator][thirdAppearanceColumnPosition] == 0)
490
{
491
if(isPossibleInThatCellCheckByRow(array, number,
492
indicator, thirdAppearanceColumnPosition))
493
{
494
thirdAppearanceRowPosition = indicator;
495
posibilities++;
496
}
497
}
498
}
499
if(posibilities == 1)
500
{
501
array[thirdAppearanceRowPosition][thirdAppearanceColumnPosition] = number;
502
return true;
503
}
504
}
505
}
506
return false;
507
}
508
509
private boolean reduceFromThreeRows(int[][] array, int firstRow, int lastRow)
510
{
511
int[][] numberAndCount = new int[2][9];
512
int[][] numberAndPosition = new int[3][27];
513
for(int column = 0; column < 9; column++)
514
{
515
numberAndCount[0][column] = column + 1;
516
numberAndCount[1][column] = 0;
517
}
518
for(int row = 0; row < 3; row++)
519
{
520
for(int column = 0; column < 27; column++)
521
{
522
numberAndPosition[row][column] = 0;
523
}
524
}
525
for(int row = firstRow; row <= lastRow; row++)
526
{
527
for(int column = 0; column < 9; column++)
528
{
529
if(array[row][column] != 0)
530
{
531
numberAndCount[1][array[row][column] - 1]++;
532
numberAndPosition[0][9 * (row % 3) + column] = array[row][column];
533
numberAndPosition[1][9 * (row % 3) + column] = row;
534
numberAndPosition[2][9 * (row % 3) + column] = column;
535
}
536
}
537
}
538
for(int column = 0; column < 9; column++)
539
{
540
if(numberAndCount[1][column] == 2)
541
{
542
int number = numberAndCount[0][column];
543
int pointer = 0;
544
int firstAppearanceRowPosition = -1;
545
int firstAppearanceColumnPosition = -1;
546
int secondAppearanceRowPosition = -1;
547
int secondAppearanceColumnPosition = -1;
548
while(pointer < 27)
549
{
550
if(numberAndPosition[0][pointer] == number)
551
{
552
firstAppearanceRowPosition = numberAndPosition[1][pointer];
553
firstAppearanceColumnPosition = numberAndPosition[2][pointer];
554
pointer++;
555
break;
556
}
557
else
558
{
559
pointer++;
560
}
561
}
562
while(pointer < 27)
563
{
564
if(numberAndPosition[0][pointer] == number)
565
{
566
secondAppearanceRowPosition = numberAndPosition[1][pointer];
567
secondAppearanceColumnPosition = numberAndPosition[2][pointer];
568
break;
569
}
570
else
571
{
572
pointer++;
573
}
574
}
575
int thirdAppearanceRowPosition = 3
576
* (firstAppearanceRowPosition / 3) + 3
577
- firstAppearanceRowPosition % 3
578
- secondAppearanceRowPosition % 3;
579
int thirdAppearanceColumnStartPosition = (3 - firstAppearanceColumnPosition / 3 - secondAppearanceColumnPosition / 3) * 3;
580
int posibilities = 0;
581
int thirdAppearanceColumnPosition = -1;
582
for(int indicator = thirdAppearanceColumnStartPosition; indicator < thirdAppearanceColumnStartPosition + 3; indicator++)
583
{
584
if(array[thirdAppearanceRowPosition][indicator] == 0)
585
{
586
if(isPossibleInThatCellCheckByColumn(array, number,
587
thirdAppearanceRowPosition, indicator))
588
{
589
thirdAppearanceColumnPosition = indicator;
590
posibilities++;
591
}
592
}
593
}
594
if(posibilities == 1)
595
{
596
array[thirdAppearanceRowPosition][thirdAppearanceColumnPosition] = number;
597
return true;
598
}
599
}
600
}
601
return false;
602
}
603
604
private boolean isPossibleInThatCellCheckByColumn(int[][] array,
605
int number, int row, int column)
606
{
607
for(int pointer = 0; pointer < 9; pointer++)
608
{
609
if(pointer != row)
610
{
611
if(array[pointer][column] == number)
612
{
613
return false;
614
}
615
}
616
}
617
return true;
618
}
619
620
private boolean isPossibleInThatCellCheckByRow(int[][] array, int number,
621
int row, int column)
622
{
623
for(int pointer = 0; pointer < 9; pointer++)
624
{
625
if(pointer != column)
626
{
627
if(array[row][pointer] == number)
628
{
629
return false;
630
}
631
}
632
}
633
return true;
634
}
635
636
/**
637
* Class attribute getter
638
*
639
* @return the array
640
*/
641
public int[][] getArray()
642
{
643
return this.array;
644
}
645
}
646
package puzzle;2

3
/**4
* @author 5
* @version 1.06
*/7
public class Deducer8
{9
private int[][] array;10
11
public Deducer(int[][] array)12
{13
this.array = new int[9][9];14
for(int row = 0; row < 9; row++)15
{16
for(int column = 0; column < 9; column++)17
{18
this.array[row][column] = array[row][column];19
}20
}21
}22
23
private boolean isFinished()24
{25
for(int row = 0; row < 9; row++)26
{27
for(int column = 0; column < 9; column++)28
{29
if(this.array[row][column] == 0)30
{31
return false;32
}33
}34
}35
return true;36
}37
38
public void deduceAll()39
{40
if(isFinished())41
{42
return;43
}44
for(int row = 0; row < 7; row = row + 3)45
{46
for(int column = 0; column < 7; column = column + 3)47
{48
if(reduceFromOneZone(this.array, row, column))49
{50
deduceAll();51
return;52
}53
}54
}55
for(int row = 0; row < 9; row++)56
{57
if(reduceFromOneRow(this.array, row))58
{59
deduceAll();60
return;61
}62
}63
for(int column = 0; column < 9; column++)64
{65
if(reduceFromOneColumn(this.array, column))66
{67
deduceAll();68
return;69
}70
}71
for(int row = 0; row < 7; row = row + 3)72
{73
if(reduceFromThreeRows(this.array, row, row + 2))74
{75
deduceAll();76
return;77
}78
}79
for(int column = 0; column < 7; column = column + 3)80
{81
if(reduceFromThreeColumns(this.array, column, column + 2))82
{83
deduceAll();84
return;85
}86
}87
}88
89
public void deduceOnce()90
{91
for(int row = 0; row < 7; row = row + 3)92
{93
for(int column = 0; column < 7; column = column + 3)94
{95
if(reduceFromOneZone(this.array, row, column))96
{97
return;98
}99
}100
}101
for(int row = 0; row < 9; row++)102
{103
if(reduceFromOneRow(this.array, row))104
{105
return;106
}107
}108
for(int column = 0; column < 9; column++)109
{110
if(reduceFromOneColumn(this.array, column))111
{112
return;113
}114
}115
for(int row = 0; row < 7; row = row + 3)116
{117
if(reduceFromThreeRows(this.array, row, row + 2))118
{119
return;120
}121
}122
for(int column = 0; column < 7; column = column + 3)123
{124
if(reduceFromThreeColumns(this.array, column, column + 2))125
{126
return;127
}128
}129
}130
131
private boolean reduceFromOneZone(int[][] array, int row, int column)132
{133
int startRow = (row / 3) * 3;134
int startColumn = (column / 3) * 3;135
int[] unknown = new int[9];136
for(int pointer = 0; pointer < 9; pointer++)137
{138
unknown[pointer] = pointer + 1;139
}140
for(int rowPointer = startRow; rowPointer < startRow + 3; rowPointer++)141
{142
for(int columnPointer = startColumn; columnPointer < startColumn + 3; columnPointer++)143
{144
if(array[rowPointer][columnPointer] != 0)145
{146
unknown[array[rowPointer][columnPointer] - 1] = 0;147
}148
}149
}150
for(int digit = 0; digit < 9; digit++)151
{152
if(unknown[digit] != 0)153
{154
int number = unknown[digit];155
int posibilities = 0;156
int rowPosition = -1;157
int columnPosition = -1;158
for(int rowPointer = startRow; rowPointer < startRow + 3; rowPointer++)159
{160
for(int columnPointer = startColumn; columnPointer < startColumn + 3; columnPointer++)161
{162
if(array[rowPointer][columnPointer] == 0)163
{164
if(isPossibleInThatCellCheckByColumn(array, number,165
rowPointer, columnPointer)166
&& isPossibleInThatCellCheckByRow(array,167
number, rowPointer, columnPointer))168
{169
rowPosition = rowPointer;170
columnPosition = columnPointer;171
posibilities++;172
}173
}174
}175
}176
if(posibilities == 1)177
{178
array[rowPosition][columnPosition] = number;179
return true;180
}181
}182
}183
return false;184
}185
186
private boolean reduceFromOneRow(int[][] array, int row)187
{188
int[] unknown = new int[9];189
for(int column = 0; column < 9; column++)190
{191
unknown[column] = column + 1;192
}193
for(int column = 0; column < 9; column++)194
{195
if(array[row][column] != 0)196
{197
unknown[array[row][column] - 1] = 0;198
}199
}200
for(int column = 0; column < 9; column++)201
{202
if(unknown[column] != 0)203
{204
int number = unknown[column];205
int posibilities = 0;206
int position = -1;207
for(int pointer = 0; pointer < 9; pointer++)208
{209
if(array[row][pointer] == 0)210
{211
if(isPossibleInThatCellCheckByColumnAndZone(array,212
number, row, pointer))213
{214
position = pointer;215
posibilities++;216
}217
}218
}219
if(posibilities == 1)220
{221
array[row][position] = number;222
return true;223
}224
}225
}226
return false;227
}228
229
private boolean reduceFromOneColumn(int[][] array, int column)230
{231
int[] unknown = new int[9];232
for(int row = 0; row < 9; row++)233
{234
unknown[row] = row + 1;235
}236
for(int row = 0; row < 9; row++)237
{238
if(array[row][column] != 0)239
{240
unknown[array[row][column] - 1] = 0;241
}242
}243
for(int row = 0; row < 9; row++)244
{245
if(unknown[row] != 0)246
{247
int number = unknown[row];248
int posibilities = 0;249
int position = -1;250
for(int pointer = 0; pointer < 9; pointer++)251
{252
if(array[pointer][column] == 0)253
{254
if(isPossibleInThatCellCheckByRowAndZone(array, number,255
pointer, column))256
{257
position = pointer;258
posibilities++;259
}260
}261
}262
if(posibilities == 1)263
{264
array[position][column] = number;265
return true;266
}267
}268
}269
return false;270
}271
272
private boolean isPossibleInThatCellCheckByRowAndZone(int[][] array,273
int number, int row, int column)274
{275
if(!isPossibleInThatCellCheckByRow(array, number, row, column))276
{277
return false;278
}279
else if(!isPossibleInThatCellCheckByZone(array, number, row, column))280
{281
return false;282
}283
else if(!canBeInThatZoneCheckByColumn(array, number, row, column))284
{285
return false;286
}287
else288
{289
return true;290
}291
}292
293
private boolean isPossibleInThatCellCheckByColumnAndZone(int[][] array,294
int number, int row, int column)295
{296
if(!isPossibleInThatCellCheckByColumn(array, number, row, column))297
{298
return false;299
}300
else if(!isPossibleInThatCellCheckByZone(array, number, row, column))301
{302
return false;303
}304
else if(!canBeInThatZoneCheckByRow(array, number, row, column))305
{306
return false;307
}308
else309
{310
return true;311
}312
}313
314
private boolean canBeInThatZoneCheckByRow(int[][] array, int number,315
int row, int column)316
{317
int startRow = (row / 3) * 3;318
int startColumn = (column / 3) * 3;319
for(int rowPointer = startRow; rowPointer < startRow + 3; rowPointer++)320
{321
if(rowPointer != row)322
{323
if(!isPossibleInThatCellCheckByRow(array, number, rowPointer,324
column))325
{326
continue;327
}328
boolean canItBe = true;329
for(int columnPointer = 0; columnPointer < 9; columnPointer++)330
{331
if(columnPointer < startColumn332
|| columnPointer > startColumn + 2)333
{334
if(array[rowPointer][columnPointer] == 0)335
{336
if(isPossibleInThatCellCheckByColumn(array, number,337
rowPointer, columnPointer)338
&& isPossibleInThatCellCheckByZone(array,339
number, rowPointer, columnPointer))340
{341
canItBe = false;342
}343
}344
}345
}346
if(canItBe)347
{348
return false;349
}350
}351
}352
return true;353
}354
355
private boolean canBeInThatZoneCheckByColumn(int[][] array, int number,356
int row, int column)357
{358
int startRow = (row / 3) * 3;359
int startColumn = (column / 3) * 3;360
for(int columnPointer = startColumn; columnPointer < startColumn + 3; columnPointer++)361
{362
if(columnPointer != column)363
{364
if(!isPossibleInThatCellCheckByColumn(array, number, row,365
columnPointer))366
{367
continue;368
}369
boolean canItBe = true;370
for(int rowPointer = 0; rowPointer < 9; rowPointer++)371
{372
if(rowPointer < startRow || rowPointer > startRow + 2)373
{374
if(array[rowPointer][columnPointer] == 0)375
{376
if(isPossibleInThatCellCheckByRow(array, number,377
rowPointer, columnPointer)378
&& isPossibleInThatCellCheckByZone(array,379
number, rowPointer, columnPointer))380
{381
canItBe = false;382
}383
}384
}385
}386
if(canItBe)387
{388
return false;389
}390
}391
}392
return true;393
}394
395
private boolean isPossibleInThatCellCheckByZone(int[][] array, int number,396
int row, int column)397
{398
int startRow = (row / 3) * 3;399
int startColumn = (column / 3) * 3;400
for(int rowPointer = startRow; rowPointer < startRow + 3; rowPointer++)401
{402
for(int columnPointer = startColumn; columnPointer < startColumn + 3; columnPointer++)403
{404
if(array[rowPointer][columnPointer] == number)405
{406
return false;407
}408
}409
}410
return true;411
}412
413
private boolean reduceFromThreeColumns(int[][] array, int firstColumn,414
int lastColumn)415
{416
int[][] numberAndCount = new int[9][2];417
int[][] numberAndPosition = new int[27][3];418
for(int row = 0; row < 9; row++)419
{420
numberAndCount[row][0] = row + 1;421
numberAndCount[row][1] = 0;422
}423
for(int row = 0; row < 27; row++)424
{425
for(int column = 0; column < 3; column++)426
{427
numberAndPosition[row][column] = 0;428
}429
}430
for(int column = firstColumn; column <= lastColumn; column++)431
{432
for(int row = 0; row < 9; row++)433
{434
if(array[row][column] != 0)435
{436
numberAndCount[array[row][column] - 1][1]++;437
numberAndPosition[9 * (column % 3) + row][0] = array[row][column];438
numberAndPosition[9 * (column % 3) + row][1] = row;439
numberAndPosition[9 * (column % 3) + row][2] = column;440
}441
}442
}443
for(int row = 0; row < 9; row++)444
{445
if(numberAndCount[row][1] == 2)446
{447
int number = numberAndCount[row][0];448
int pointer = 0;449
int firstAppearanceRowPosition = -1;450
int firstAppearanceColumnPosition = -1;451
int secondAppearanceRowPosition = -1;452
int secondAppearanceColumnPosition = -1;453
while(pointer < 27)454
{455
if(numberAndPosition[pointer][0] == number)456
{457
firstAppearanceRowPosition = numberAndPosition[pointer][1];458
firstAppearanceColumnPosition = numberAndPosition[pointer][2];459
pointer++;460
break;461
}462
else463
{464
pointer++;465
}466
}467
while(pointer < 27)468
{469
if(numberAndPosition[pointer][0] == number)470
{471
secondAppearanceRowPosition = numberAndPosition[pointer][1];472
secondAppearanceColumnPosition = numberAndPosition[pointer][2];473
break;474
}475
else476
{477
pointer++;478
}479
}480
int thirdAppearanceColumnPosition = 3481
* (firstAppearanceColumnPosition / 3) + 3482
- firstAppearanceColumnPosition % 3483
- secondAppearanceColumnPosition % 3;484
int thirdAppearanceRowStartPosition = (3 - firstAppearanceRowPosition / 3 - secondAppearanceRowPosition / 3) * 3;485
int posibilities = 0;486
int thirdAppearanceRowPosition = -1;487
for(int indicator = thirdAppearanceRowStartPosition; indicator < thirdAppearanceRowStartPosition + 3; indicator++)488
{489
if(array[indicator][thirdAppearanceColumnPosition] == 0)490
{491
if(isPossibleInThatCellCheckByRow(array, number,492
indicator, thirdAppearanceColumnPosition))493
{494
thirdAppearanceRowPosition = indicator;495
posibilities++;496
}497
}498
}499
if(posibilities == 1)500
{501
array[thirdAppearanceRowPosition][thirdAppearanceColumnPosition] = number;502
return true;503
}504
}505
}506
return false;507
}508
509
private boolean reduceFromThreeRows(int[][] array, int firstRow, int lastRow)510
{511
int[][] numberAndCount = new int[2][9];512
int[][] numberAndPosition = new int[3][27];513
for(int column = 0; column < 9; column++)514
{515
numberAndCount[0][column] = column + 1;516
numberAndCount[1][column] = 0;517
}518
for(int row = 0; row < 3; row++)519
{520
for(int column = 0; column < 27; column++)521
{522
numberAndPosition[row][column] = 0;523
}524
}525
for(int row = firstRow; row <= lastRow; row++)526
{527
for(int column = 0; column < 9; column++)528
{529
if(array[row][column] != 0)530
{531
numberAndCount[1][array[row][column] - 1]++;532
numberAndPosition[0][9 * (row % 3) + column] = array[row][column];533
numberAndPosition[1][9 * (row % 3) + column] = row;534
numberAndPosition[2][9 * (row % 3) + column] = column;535
}536
}537
}538
for(int column = 0; column < 9; column++)539
{540
if(numberAndCount[1][column] == 2)541
{542
int number = numberAndCount[0][column];543
int pointer = 0;544
int firstAppearanceRowPosition = -1;545
int firstAppearanceColumnPosition = -1;546
int secondAppearanceRowPosition = -1;547
int secondAppearanceColumnPosition = -1;548
while(pointer < 27)549
{550
if(numberAndPosition[0][pointer] == number)551
{552
firstAppearanceRowPosition = numberAndPosition[1][pointer];553
firstAppearanceColumnPosition = numberAndPosition[2][pointer];554
pointer++;555
break;556
}557
else558
{559
pointer++;560
}561
}562
while(pointer < 27)563
{564
if(numberAndPosition[0][pointer] == number)565
{566
secondAppearanceRowPosition = numberAndPosition[1][pointer];567
secondAppearanceColumnPosition = numberAndPosition[2][pointer];568
break;569
}570
else571
{572
pointer++;573
}574
}575
int thirdAppearanceRowPosition = 3576
* (firstAppearanceRowPosition / 3) + 3577
- firstAppearanceRowPosition % 3578
- secondAppearanceRowPosition % 3;579
int thirdAppearanceColumnStartPosition = (3 - firstAppearanceColumnPosition / 3 - secondAppearanceColumnPosition / 3) * 3;580
int posibilities = 0;581
int thirdAppearanceColumnPosition = -1;582
for(int indicator = thirdAppearanceColumnStartPosition; indicator < thirdAppearanceColumnStartPosition + 3; indicator++)583
{584
if(array[thirdAppearanceRowPosition][indicator] == 0)585
{586
if(isPossibleInThatCellCheckByColumn(array, number,587
thirdAppearanceRowPosition, indicator))588
{589
thirdAppearanceColumnPosition = indicator;590
posibilities++;591
}592
}593
}594
if(posibilities == 1)595
{596
array[thirdAppearanceRowPosition][thirdAppearanceColumnPosition] = number;597
return true;598
}599
}600
}601
return false;602
}603
604
private boolean isPossibleInThatCellCheckByColumn(int[][] array,605
int number, int row, int column)606
{607
for(int pointer = 0; pointer < 9; pointer++)608
{609
if(pointer != row)610
{611
if(array[pointer][column] == number)612
{613
return false;614
}615
}616
}617
return true;618
}619
620
private boolean isPossibleInThatCellCheckByRow(int[][] array, int number,621
int row, int column)622
{623
for(int pointer = 0; pointer < 9; pointer++)624
{625
if(pointer != column)626
{627
if(array[row][pointer] == number)628
{629
return false;630
}631
}632
}633
return true;634
}635
636
/**637
* Class attribute getter638
* 639
* @return the array640
*/641
public int[][] getArray()642
{643
return this.array;644
}645
}646

puzzle.jsp:
1
<%@ page language="java" contentType="text/html; charset=utf8"%>
2
<%@ page import="puzzle.*"%>
3
<%
4
if(request.getParameter("type")!=null)
5
{
6
try
7
{
8
String array=request.getParameter("array");
9
String[] numbers=array.split(",");
10
int[][] dealingArray=new int[9][9];
11
for(int row=0;row<9;row++)
12
{
13
for(int column=0;column<9;column++)
14
{
15
dealingArray[row][column]=Integer.parseInt(numbers[row*9+column]);
16
}
17
}
18
Deducer deducer=new Deducer(dealingArray);
19
if(request.getParameter("type").equals("OneStep"))
20
{
21
deducer.deduceOnce();
22
}
23
else if(request.getParameter("type").equals("AllSteps"))
24
{
25
deducer.deduceAll();
26
}
27
StringBuilder sb=new StringBuilder();
28
for(int row=0;row<9;row++)
29
{
30
for(int column=0;column<9;column++)
31
{
32
if(sb.toString().equals(""))
33
{
34
sb.append(deducer.getArray()[row][column]);
35
}
36
else
37
{
38
sb.append(","+deducer.getArray()[row][column]);
39
}
40
}
41
}
42
out.println(sb);
43
}
44
catch(Exception e)
45
{
46
out.println("ri");
47
}
48
return;
49
}
50
%>
51
<html>
52
<body>
53
<script>
54
var request=false;
55
try
56
{
57
request = new XMLHttpRequest();//Firefox
58
}
59
catch(trymicrosoft)
60
{
61
try
62
{
63
request = new ActiveXObject("Msxml2.XMLHTTP.5.0");//New IE
64
}
65
catch(othermicrosoft)
66
{
67
try
68
{
69
request = new ActiveXObject("Microsoft.XMLHTTP");//Old IE
70
}
71
catch(failed)
72
{
73
request = false;//Unknown browser
74
}
75
}
76
}
77
if(!request)
78
{
79
alert("Please use Internet Explorer");
80
}
81
function dealNullInput(input)
82
{
83
if(input=="")
84
{
85
return "0";
86
}
87
else
88
{
89
return input;
90
}
91
}
92
function dealZeroOutput(input)
93
{
94
if(input==0)
95
{
96
return "";
97
}
98
else
99
{
100
return input;
101
}
102
}
103
function sendOneStepRequest()
104
{
105
url=escape("puzzle.jsp")+"?random=" + Math.random();//use a random number to avoid cache
106
request.open("POST",url,true);//connection method
107
request.onreadystatechange=showProcess;//show Process method
108
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
109
var array="";
110
for(var i=0;i<81;i++)
111
{
112
if(array=="")
113
{
114
array=array+dealNullInput(document.getElementsByName("TextBox")[i].value);
115
}
116
else
117
{
118
array=array+","+dealNullInput(document.getElementsByName("TextBox")[i].value);
119
}
120
}
121
request.send("type=OneStep"+"&array="+escape(array));
122
}
123
function sendAllStepsRequest()
124
{
125
url=escape("puzzle.jsp")+"?random=" + Math.random();
126
request.open("POST",url,true);//connection method
127
request.onreadystatechange=showProcess;//show Process method
128
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
129
var array="";
130
for(var i=0;i<81;i++)
131
{
132
if(array=="")
133
{
134
array=array+dealNullInput(document.getElementsByName("TextBox")[i].value);
135
}
136
else
137
{
138
array=array+","+dealNullInput(document.getElementsByName("TextBox")[i].value.replace(/ /g, ""));
139
}
140
}
141
request.send("type=AllSteps"+"&array="+escape(array));
142
}
143
function showProcess()
144
{
145
if(request.readyState == 4)//finished
146
{
147
if(request.status == 200)//normal
148
{
149
var splitResult=request.responseText.split(",");
150
for(var i=0;i<81;i++)
151
{
152
document.getElementsByName("TextBox")[i].value=dealZeroOutput(splitResult[i]);
153
}
154
}
155
}
156
else if(request.readyState == 1)
157
{
158
//"finished step1";
159
}
160
else if(request.readyState == 2)
161
{
162
//"finished step2";
163
}
164
else if(request.readyState == 3)
165
{
166
//"finished step3";
167
}
168
}
169
</script>
170
<table>
171
<tr>
172
<td>
173
<input name="TextBox" type="text" style="width: 25px"/>
174
</td>
175
<td>
176
<input name="TextBox" type="text" style="width: 25px"/>
177
</td>
178
<td>
179
<input name="TextBox" type="text" style="width: 25px"/>
180
</td>
181
<td>
182
<input name="TextBox" type="text" style="width: 25px"/>
183
</td>
184
<td>
185
<input name="TextBox" type="text" style="width: 25px"/>
186
</td>
187
<td>
188
<input name="TextBox" type="text" style="width: 25px"/>
189
</td>
190
<td>
191
<input name="TextBox" type="text" style="width: 25px"/>
192
</td>
193
<td>
194
<input name="TextBox" type="text" style="width: 25px"/>
195
</td>
196
<td>
197
<input name="TextBox" type="text" style="width: 25px"/>
198
</td>
199
</tr>
200
<tr>
201
<td>
202
<input name="TextBox" type="text" style="width: 25px"/>
203
</td>
204
<td>
205
<input name="TextBox" type="text" style="width: 25px"/>
206
</td>
207
<td>
208
<input name="TextBox" type="text" style="width: 25px"/>
209
</td>
210
<td>
211
<input name="TextBox" type="text" style="width: 25px"/>
212
</td>
213
<td>
214
<input name="TextBox" type="text" style="width: 25px"/>
215
</td>
216
<td>
217
<input name="TextBox" type="text" style="width: 25px"/>
218
</td>
219
<td>
220
<input name="TextBox" type="text" style="width: 25px"/>
221
</td>
222
<td>
223
<input name="TextBox" type="text" style="width: 25px"/>
224
</td>
225
<td>
226
<input name="TextBox" type="text" style="width: 25px"/>
227
</td>
228
</tr>
229
<tr>
230
<td>
231
<input name="TextBox" type="text" style="width: 25px"/>
232
</td>
233
<td>
234
<input name="TextBox" type="text" style="width: 25px"/>
235
</td>
236
<td>
237
<input name="TextBox" type="text" style="width: 25px"/>
238
</td>
239
<td>
240
<input name="TextBox" type="text" style="width: 25px"/>
241
</td>
242
<td>
243
<input name="TextBox" type="text" style="width: 25px"/>
244
</td>
245
<td>
246
<input name="TextBox" type="text" style="width: 25px"/>
247
</td>
248
<td>
249
<input name="TextBox" type="text" style="width: 25px"/>
250
</td>
251
<td>
252
<input name="TextBox" type="text" style="width: 25px"/>
253
</td>
254
<td>
255
<input name="TextBox" type="text" style="width: 25px"/>
256
</td>
257
</tr>
258
<tr>
259
<td>
260
<input name="TextBox" type="text" style="width: 25px"/>
261
</td>
262
<td>
263
<input name="TextBox" type="text" style="width: 25px"/>
264
</td>
265
<td>
266
<input name="TextBox" type="text" style="width: 25px"/>
267
</td>
268
<td>
269
<input name="TextBox" type="text" style="width: 25px"/>
270
</td>
271
<td>
272
<input name="TextBox" type="text" style="width: 25px"/>
273
</td>
274
<td>
275
<input name="TextBox" type="text" style="width: 25px"/>
276
</td>
277
<td>
278
<input name="TextBox" type="text" style="width: 25px"/>
279
</td>
280
<td>
281
<input name="TextBox" type="text" style="width: 25px"/>
282
</td>
283
<td>
284
<input name="TextBox" type="text" style="width: 25px"/>
285
</td>
286
</tr>
287
<tr>
288
<td>
289
<input name="TextBox" type="text" style="width: 25px"/>
290
</td>
291
<td>
292
<input name="TextBox" type="text" style="width: 25px"/>
293
</td>
294
<td>
295
<input name="TextBox" type="text" style="width: 25px"/>
296
</td>
297
<td>
298
<input name="TextBox" type="text" style="width: 25px"/>
299
</td>
300
<td>
301
<input name="TextBox" type="text" style="width: 25px"/>
302
</td>
303
<td>
304
<input name="TextBox" type="text" style="width: 25px"/>
305
</td>
306
<td>
307
<input name="TextBox" type="text" style="width: 25px"/>
308
</td>
309
<td>
310
<input name="TextBox" type="text" style="width: 25px"/>
311
</td>
312
<td>
313
<input name="TextBox" type="text" style="width: 25px"/>
314
</td>
315
</tr>
316
<tr>
317
<td>
318
<input name="TextBox" type="text" style="width: 25px"/>
319
</td>
320
<td>
321
<input name="TextBox" type="text" style="width: 25px"/>
322
</td>
323
<td>
324
<input name="TextBox" type="text" style="width: 25px"/>
325
</td>
326
<td>
327
<input name="TextBox" type="text" style="width: 25px"/>
328
</td>
329
<td>
330
<input name="TextBox" type="text" style="width: 25px"/>
331
</td>
332
<td>
333
<input name="TextBox" type="text" style="width: 25px"/>
334
</td>
335
<td>
336
<input name="TextBox" type="text" style="width: 25px"/>
337
</td>
338
<td>
339
<input name="TextBox" type="text" style="width: 25px"/>
340
</td>
341
<td>
342
<input name="TextBox" type="text" style="width: 25px"/>
343
</td>
344
</tr>
345
<tr>
346
<td>
347
<input name="TextBox" type="text" style="width: 25px"/>
348
</td>
349
<td>
350
<input name="TextBox" type="text" style="width: 25px"/>
351
</td>
352
<td>
353
<input name="TextBox" type="text" style="width: 25px"/>
354
</td>
355
<td>
356
<input name="TextBox" type="text" style="width: 25px"/>
357
</td>
358
<td>
359
<input name="TextBox" type="text" style="width: 25px"/>
360
</td>
361
<td>
362
<input name="TextBox" type="text" style="width: 25px"/>
363
</td>
364
<td>
365
<input name="TextBox" type="text" style="width: 25px"/>
366
</td>
367
<td>
368
<input name="TextBox" type="text" style="width: 25px"/>
369
</td>
370
<td>
371
<input name="TextBox" type="text" style="width: 25px"/>
372
</td>
373
</tr>
374
<tr>
375
<td>
376
<input name="TextBox" type="text" style="width: 25px"/>
377
</td>
378
<td>
379
<input name="TextBox" type="text" style="width: 25px"/>
380
</td>
381
<td>
382
<input name="TextBox" type="text" style="width: 25px"/>
383
</td>
384
<td>
385
<input name="TextBox" type="text" style="width: 25px"/>
386
</td>
387
<td>
388
<input name="TextBox" type="text" style="width: 25px"/>
389
</td>
390
<td>
391
<input name="TextBox" type="text" style="width: 25px"/>
392
</td>
393
<td>
394
<input name="TextBox" type="text" style="width: 25px"/>
395
</td>
396
<td>
397
<input name="TextBox" type="text" style="width: 25px"/>
398
</td>
399
<td>
400
<input name="TextBox" type="text" style="width: 25px"/>
401
</td>
402
</tr>
403
<tr>
404
<td>
405
<input name="TextBox" type="text" style="width: 25px"/>
406
</td>
407
<td>
408
<input name="TextBox" type="text" style="width: 25px"/>
409
</td>
410
<td>
411
<input name="TextBox" type="text" style="width: 25px"/>
412
</td>
413
<td>
414
<input name="TextBox" type="text" style="width: 25px"/>
415
</td>
416
<td>
417
<input name="TextBox" type="text" style="width: 25px"/>
418
</td>
419
<td>
420
<input name="TextBox" type="text" style="width: 25px"/>
421
</td>
422
<td>
423
<input name="TextBox" type="text" style="width: 25px"/>
424
</td>
425
<td>
426
<input name="TextBox" type="text" style="width: 25px"/>
427
</td>
428
<td>
429
<input name="TextBox" type="text" style="width: 25px"/>
430
</td>
431
</tr>
432
</table>
433
<input type="button" name="OneStep" value="OneStep" id="OneStep" onclick="sendOneStepRequest()" />
434
<input type="button" name="AllSteps" value="AllSteps" id="AllSteps" onclick="sendAllStepsRequest()" />
435
</body>
436
</html>
<%@ page language="java" contentType="text/html; charset=utf8"%>2
<%@ page import="puzzle.*"%>3
<%4
if(request.getParameter("type")!=null)5
{6
try7
{8
String array=request.getParameter("array");9
String[] numbers=array.split(",");10
int[][] dealingArray=new int[9][9];11
for(int row=0;row<9;row++)12
{13
for(int column=0;column<9;column++)14
{15
dealingArray[row][column]=Integer.parseInt(numbers[row*9+column]);16
}17
}18
Deducer deducer=new Deducer(dealingArray);19
if(request.getParameter("type").equals("OneStep"))20
{21
deducer.deduceOnce();22
}23
else if(request.getParameter("type").equals("AllSteps"))24
{25
deducer.deduceAll();26
}27
StringBuilder sb=new StringBuilder();28
for(int row=0;row<9;row++)29
{30
for(int column=0;column<9;column++)31
{32
if(sb.toString().equals(""))33
{34
sb.append(deducer.getArray()[row][column]);35
}36
else37
{38
sb.append(","+deducer.getArray()[row][column]);39
}40
}41
}42
out.println(sb);43
}44
catch(Exception e)45
{46
out.println("ri");47
}48
return;49
}50
%>51
<html>52
<body>53
<script>54
var request=false;55
try56
{57
request = new XMLHttpRequest();//Firefox58
}59
catch(trymicrosoft)60
{61
try 62
{63
request = new ActiveXObject("Msxml2.XMLHTTP.5.0");//New IE64
} 65
catch(othermicrosoft)66
{67
try 68
{69
request = new ActiveXObject("Microsoft.XMLHTTP");//Old IE70
} 71
catch(failed)72
{73
request = false;//Unknown browser74
}75
}76
}77
if(!request)78
{79
alert("Please use Internet Explorer");80
}81
function dealNullInput(input)82
{83
if(input=="")84
{85
return "0";86
}87
else88
{89
return input;90
}91
}92
function dealZeroOutput(input)93
{94
if(input==0)95
{96
return "";97
}98
else99
{100
return input;101
}102
}103
function sendOneStepRequest()104
{105
url=escape("puzzle.jsp")+"?random=" + Math.random();//use a random number to avoid cache106
request.open("POST",url,true);//connection method107
request.onreadystatechange=showProcess;//show Process method108
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');109
var array="";110
for(var i=0;i<81;i++)111
{112
if(array=="")113
{114
array=array+dealNullInput(document.getElementsByName("TextBox")[i].value);115
}116
else117
{118
array=array+","+dealNullInput(document.getElementsByName("TextBox")[i].value);119
}120
}121
request.send("type=OneStep"+"&array="+escape(array));122
}123
function sendAllStepsRequest()124
{125
url=escape("puzzle.jsp")+"?random=" + Math.random();126
request.open("POST",url,true);//connection method127
request.onreadystatechange=showProcess;//show Process method128
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');129
var array="";130
for(var i=0;i<81;i++)131
{132
if(array=="")133
{134
array=array+dealNullInput(document.getElementsByName("TextBox")[i].value);135
}136
else137
{138
array=array+","+dealNullInput(document.getElementsByName("TextBox")[i].value.replace(/ /g, ""));139
}140
}141
request.send("type=AllSteps"+"&array="+escape(array));142
}143
function showProcess() 144
{145
if(request.readyState == 4)//finished146
{147
if(request.status == 200)//normal148
{149
var splitResult=request.responseText.split(",");150
for(var i=0;i<81;i++)151
{152
document.getElementsByName("TextBox")[i].value=dealZeroOutput(splitResult[i]);153
}154
}155
}156
else if(request.readyState == 1)157
{158
//"finished step1";159
}160
else if(request.readyState == 2)161
{162
//"finished step2";163
}164
else if(request.readyState == 3)165
{166
//"finished step3";167
}168
}169
</script>170
<table>171
<tr>172
<td>173
<input name="TextBox" type="text" style="width: 25px"/>174
</td>175
<td>176
<input name="TextBox" type="text" style="width: 25px"/>177
</td>178
<td>179
<input name="TextBox" type="text" style="width: 25px"/>180
</td>181
<td>182
<input name="TextBox" type="text" style="width: 25px"/>183
</td>184
<td>185
<input name="TextBox" type="text" style="width: 25px"/>186
</td>187
<td>188
<input name="TextBox" type="text" style="width: 25px"/>189
</td>190
<td>191
<input name="TextBox" type="text" style="width: 25px"/>192
</td>193
<td>194
<input name="TextBox" type="text" style="width: 25px"/>195
</td>196
<td>197
<input name="TextBox" type="text" style="width: 25px"/>198
</td>199
</tr>200
<tr>201
<td>202
<input name="TextBox" type="text" style="width: 25px"/>203
</td>204
<td>205
<input name="TextBox" type="text" style="width: 25px"/>206
</td>207
<td>208
<input name="TextBox" type="text" style="width: 25px"/>209
</td>210
<td>211
<input name="TextBox" type="text" style="width: 25px"/>212
</td>213
<td>214
<input name="TextBox" type="text" style="width: 25px"/>215
</td>216
<td>217
<input name="TextBox" type="text" style="width: 25px"/>218
</td>219
<td>220
<input name="TextBox" type="text" style="width: 25px"/>221
</td>222
<td>223
<input name="TextBox" type="text" style="width: 25px"/>224
</td>225
<td>226
<input name="TextBox" type="text" style="width: 25px"/>227
</td>228
</tr>229
<tr>230
<td>231
<input name="TextBox" type="text" style="width: 25px"/>232
</td>233
<td>234
<input name="TextBox" type="text" style="width: 25px"/>235
</td>236
<td>237
<input name="TextBox" type="text" style="width: 25px"/>238
</td>239
<td>240
<input name="TextBox" type="text" style="width: 25px"/>241
</td>242
<td>243
<input name="TextBox" type="text" style="width: 25px"/>244
</td>245
<td>246
<input name="TextBox" type="text" style="width: 25px"/>247
</td>248
<td>249
<input name="TextBox" type="text" style="width: 25px"/>250
</td>251
<td>252
<input name="TextBox" type="text" style="width: 25px"/>253
</td>254
<td>255
<input name="TextBox" type="text" style="width: 25px"/>256
</td>257
</tr>258
<tr>259
<td>260
<input name="TextBox" type="text" style="width: 25px"/>261
</td>262
<td>263
<input name="TextBox" type="text" style="width: 25px"/>264
</td>265
<td>266
<input name="TextBox" type="text" style="width: 25px"/>267
</td>268
<td>269
<input name="TextBox" type="text" style="width: 25px"/>270
</td>271
<td>272
<input name="TextBox" type="text" style="width: 25px"/>273
</td>274
<td>275
<input name="TextBox" type="text" style="width: 25px"/>276
</td>277
<td>278
<input name="TextBox" type="text" style="width: 25px"/>279
</td>280
<td>281
<input name="TextBox" type="text" style="width: 25px"/>282
</td>283
<td>284
<input name="TextBox" type="text" style="width: 25px"/>285
</td>286
</tr>287
<tr>288
<td>289
<input name="TextBox" type="text" style="width: 25px"/>290
</td>291
<td>292
<input name="TextBox" type="text" style="width: 25px"/>293
</td>294
<td>295
<input name="TextBox" type="text" style="width: 25px"/>296
</td>297
<td>298
<input name="TextBox" type="text" style="width: 25px"/>299
</td>300
<td>301
<input name="TextBox" type="text" style="width: 25px"/>302
</td>303
<td>304
<input name="TextBox" type="text" style="width: 25px"/>305
</td>306
<td>307
<input name="TextBox" type="text" style="width: 25px"/>308
</td>309
<td>310
<input name="TextBox" type="text" style="width: 25px"/>311
</td>312
<td>313
<input name="TextBox" type="text" style="width: 25px"/>314
</td>315
</tr>316
<tr>317
<td>318
<input name="TextBox" type="text" style="width: 25px"/>319
</td>320
<td>321
<input name="TextBox" type="text" style="width: 25px"/>322
</td>323
<td>324
<input name="TextBox" type="text" style="width: 25px"/>325
</td>326
<td>327
<input name="TextBox" type="text" style="width: 25px"/>328
</td>329
<td>330
<input name="TextBox" type="text" style="width: 25px"/>331
</td>332
<td>333
<input name="TextBox" type="text" style="width: 25px"/>334
</td>335
<td>336
<input name="TextBox" type="text" style="width: 25px"/>337
</td>338
<td>339
<input name="TextBox" type="text" style="width: 25px"/>340
</td>341
<td>342
<input name="TextBox" type="text" style="width: 25px"/>343
</td>344
</tr>345
<tr>346
<td>347
<input name="TextBox" type="text" style="width: 25px"/>348
</td>349
<td>350
<input name="TextBox" type="text" style="width: 25px"/>351
</td>352
<td>353
<input name="TextBox" type="text" style="width: 25px"/>354
</td>355
<td>356
<input name="TextBox" type="text" style="width: 25px"/>357
</td>358
<td>359
<input name="TextBox" type="text" style="width: 25px"/>360
</td>361
<td>362
<input name="TextBox" type="text" style="width: 25px"/>363
</td>364
<td>365
<input name="TextBox" type="text" style="width: 25px"/>366
</td>367
<td>368
<input name="TextBox" type="text" style="width: 25px"/>369
</td>370
<td>371
<input name="TextBox" type="text" style="width: 25px"/>372
</td>373
</tr>374
<tr>375
<td>376
<input name="TextBox" type="text" style="width: 25px"/>377
</td>378
<td>379
<input name="TextBox" type="text" style="width: 25px"/>380
</td>381
<td>382
<input name="TextBox" type="text" style="width: 25px"/>383
</td>384
<td>385
<input name="TextBox" type="text" style="width: 25px"/>386
</td>387
<td>388
<input name="TextBox" type="text" style="width: 25px"/>389
</td>390
<td>391
<input name="TextBox" type="text" style="width: 25px"/>392
</td>393
<td>394
<input name="TextBox" type="text" style="width: 25px"/>395
</td>396
<td>397
<input name="TextBox" type="text" style="width: 25px"/>398
</td>399
<td>400
<input name="TextBox" type="text" style="width: 25px"/>401
</td>402
</tr>403
<tr>404
<td>405
<input name="TextBox" type="text" style="width: 25px"/>406
</td>407
<td>408
<input name="TextBox" type="text" style="width: 25px"/>409
</td>410
<td>411
<input name="TextBox" type="text" style="width: 25px"/>412
</td>413
<td>414
<input name="TextBox" type="text" style="width: 25px"/>415
</td>416
<td>417
<input name="TextBox" type="text" style="width: 25px"/>418
</td>419
<td>420
<input name="TextBox" type="text" style="width: 25px"/>421
</td>422
<td>423
<input name="TextBox" type="text" style="width: 25px"/>424
</td>425
<td>426
<input name="TextBox" type="text" style="width: 25px"/>427
</td>428
<td>429
<input name="TextBox" type="text" style="width: 25px"/>430
</td>431
</tr>432
</table>433
<input type="button" name="OneStep" value="OneStep" id="OneStep" onclick="sendOneStepRequest()" />434
<input type="button" name="AllSteps" value="AllSteps" id="AllSteps" onclick="sendAllStepsRequest()" />435
</body>436
</html>



浙公网安备 33010602011771号