import java.io.*;
import java.util.*;
/**
* @param 导师:袁超
* @param 作者:刘跃勇
* @param 日期:2010/4/23
*/
public class Link {
public static void main(String[] argv) throws IOException {
gameRun();
}
/**
* @param 无
* @param ----------------------------------------------------------------
* @param 函数内部变量说明:
* @param in
* 记录键盘输入
* @param num
* 记录配对的对数
*/
public static byte gameRun() throws NumberFormatException, IOException {
map = createMap((byte) 6, (byte) 8, (byte) 4);
printMap(map);
System.out.println();
swap(map);
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));// 记录键盘输入
byte num = (byte) (map.length * map[0].length / 2);// 记录配对的对数
while (0 < num) {
printMap(map);
System.out.print("行(先):");
fRow = (byte) Integer.parseInt(in.readLine());
System.out.print("列(先):");
fCol = (byte) Integer.parseInt(in.readLine());
System.out.print("你选择了:");
System.out.println(map[fRow][fCol]);
System.out.print("行(后):");
bRow = (byte) Integer.parseInt(in.readLine());
System.out.print("列(后):");
bCol = (byte) Integer.parseInt(in.readLine());
System.out.print("你选择了:");
System.out.println(map[bRow][bCol]);
if (map[fRow][fCol] == map[bRow][bCol]) {
if (updateX(fRow, fCol, bRow, bCol)
|| updateY(fRow, fCol, bRow, bCol)
|| updateOne(fRow, fCol, bRow, bCol)
|| updateTwo(fRow, fCol, bRow, bCol)) {
map[fRow][fCol] = -1;
map[bRow][bCol] = -1;
num--;
}
}
}
System.out.println("Win");
return 0;
}
/**
* 函数功能:两次选择在同一行且不需要变向时的判断
*
* @return 地图需要变动返回true,否则返回false
*/
public static boolean updateX(byte fRow, byte fCol, byte bRow, byte bCol) {
if (fRow != bRow) {
return false;// 本函数只考虑同行且不需要变向时的情况,不同行即返回false
}
if (fCol == bCol) {
return false;// 两次选择一样,不能删除,即地图不需要变动
}
if (fCol < bCol) {
for (byte i = (byte) (fCol + 1); i < bCol; i++) {
if (-1 != map[fRow][i]) {
return false;
}
}
} else {
for (byte i = (byte) (bCol + 1); i < fCol; i++) {
if (-1 != map[bRow][i]) {
return false;
}
}
}
return true;
}
/**
* 函数功能:两次选择在同一列且不需要变向时的判断
*
* @return 地图需要变动返回true,否则返回false
*/
public static boolean updateY(byte fRow, byte fCol, byte bRow, byte bCol) {
if (fCol != bCol) {
return false;// 本函数只考虑同列且不需要变向时的情况,不同列即返回false
}
if (fRow == bRow) {
return false;// 两次选择一样,不能删除,即地图不需要变动
}
if (fRow < bRow) {
for (byte i = (byte) (fRow + 1); i < bRow; i++) {
if (-1 != map[i][fCol]) {
return false;
}
}
} else {
for (byte i = (byte) (bRow + 1); i < fRow; i++) {
if (-1 != map[i][bCol]) {
return false;
}
}
}
return true;
}
/**
* 函数功能:只需一次变向的判断
*
* @return 地图需要变动返回true,否则返回false
*
* @param 先左上先左下先右上先右下四种情况是可以合并的
*/
public static boolean updateOne(byte fRow, byte fCol, byte bRow, byte bCol) {
if (fRow == bRow || fCol == bCol) {
return false;// 同行或同列有专门的判断函数,本函数不再考虑
}
if (-1 == map[fRow][bCol] || -1 == map[bRow][fCol])// 判断两个结点是否已清空,也就是图片已经消掉了
{
if (updateX(fRow, fCol, fRow, bCol)
&& updateY(fRow, bCol, bRow, bCol)) {
return true;
}
if (updateY(fRow, fCol, bRow, fCol)
&& updateX(bRow, fCol, bRow, bCol)) {
return true;
}
}
return false;
}
/**
* 函数功能:需两次变向的判断
*
* @return 地图需要变动返回true,否则返回false
*/
public static boolean updateTwo(byte fRow, byte fCol, byte bRow, byte bCol) {
byte m = (byte) map.length;
byte n = (byte) map[0].length;
/** 两次选择都在边界 */
if ((0 == fRow && 0 == bRow) || (m == fRow && m == bRow)
|| (0 == fCol && 0 == bCol) || (n == fCol && n == bCol)) {
return true;
}
/** 只有一次选择在边界 */
if (0 == fRow && 0 != bRow) {
if (updateY(bRow, bCol, (byte) 0, bCol)) {
return true;
}
}
if (0 == bRow && 0 != fRow) {
if (updateY(fRow, fCol, (byte) 0, fCol)) {
return true;
}
}
if (m == fRow && m != bRow) {
if (updateY(bRow, bCol, m, bCol)) {
return true;
}
}
if (m == bRow && m != fRow) {
if (updateY(fRow, fCol, m, fCol)) {
return true;
}
}
if (0 == fCol && 0 != bCol) {
if (updateX(bRow, bCol, bRow, (byte) 0)) {
return true;
}
}
if (0 == bCol && 0 != fCol) {
if (updateX(fRow, fCol, fRow, (byte) 0)) {
return true;
}
}
if (n == fCol && n != bCol) {
if (updateX(bRow, bCol, bRow, n)) {
return true;
}
}
if (n == bCol && n != fCol) {
if (updateX(fRow, fCol, fRow, n)) {
return true;
}
}
/** 两次选择都不在边界 */
if ((updateX(fRow, fCol, fRow, (byte) 0) && updateX(bRow, bCol, bRow,
(byte) 0))
|| (updateX(fRow, fCol, fRow, n) && updateX(bRow, bCol, bRow, n))) {
return true;
}
if ((updateY(fRow, fCol, (byte) 0, fCol) && updateY(bRow, bCol,
(byte) 0, bCol))
|| (updateY(fRow, fCol, m, fCol) && updateY(bRow, bCol, m, bCol))) {
return true;
}
for (byte i = 0; i < m; i++) {
for (byte j = 0; j < n; j++) {
if (updateOne(fRow, fCol, i, j)
&& (updateX(i, j, bRow, bCol) || updateY(i, j, bRow,
bCol))) {
return true;
}
if (updateOne(bRow, bCol, i, j)
&& (updateX(i, j, fRow, fCol) || updateY(i, j, fRow,
fCol))) {
return true;
}
}
}
return false;
}
/**
* @param m
* 将要创建地图的行
* @param n
* 将要创建地图的列
* @param type
* 地图中不同图片种类的数量
* @return 返回一个二维的整型数组用于表示地图
* @param 注意:
* @param 前两个参数至少要有一个偶数,为了连连看能够配对.
* @param 不在这里添加参数m,n的奇偶校验是为了写成通用方法.
*/
public static byte[][] createMap(byte m, byte n, byte type) {
byte[][] map = new byte[m][n];
for (byte i = 0; i < m; i++) {
for (byte j = 0; j < n; j++) {
map[i][j] = (byte) (j % type);
}
}
return map;
}
/**
* @param map
* @param 函数功能:输出地图
*/
public static void printMap(byte[][] map) {
byte m = (byte) map.length;
byte n = (byte) map[0].length;
for (byte i = 0; i < m; i++) {
for (byte j = 0; j < n; j++) {
if (-1 == map[i][j]) {
System.out.print(" ");
} else {
System.out.print(map[i][j]);
}
System.out.print(" ");
}
System.out.println();
}
}
/**
* @param map
* @param 函数功能:打乱地图
* @param x,y随机坐标
*/
public static void swap(byte[][] map) {
byte m = (byte) map.length;
byte n = (byte) map[0].length;
byte x, y;// 记录坐标
for (byte i = 0; i < m; i++) {
for (byte j = 0; j < n; j++) {
x = (byte) rand.nextInt(m);
y = (byte) rand.nextInt(n);
/**
* 当 i==x && j==y 的时候,异或交换的结果是0,会丢失原数,所以要加个判断
* 当然也可以不用异或,再定义个变量来交换
*/
if (i != x || j != y) {
map[i][j] ^= map[x][y];
map[x][y] ^= map[i][j];
map[i][j] ^= map[x][y];
}
}
}
}
static Random rand = new Random();
/** 游戏地图 */
static byte[][] map;
/** 先选择的横坐标 */
static byte fCol;
/** 先选择的纵坐标 */
static byte fRow;
/** 后选择的横坐标 */
static byte bCol;
/** 后选择的纵坐标 */
static byte bRow;
}