📄 llkmatrix.java
字号:
import java.util.Random;
public class LLKMatrix
{
private int matrix[][];
private int VSize = 0;
private int HSize = 0;
private int SeedCount = 0;
private int Score1 = 10;
private int Score2 = 20;
private int Score3 = 50;
public int VConn = - 10;
public int HConn = - 11;
public int SConn = - 10;
public int LDConn = - 12;
public int LUConn = - 13;
public int RDConn = - 14;
public int RUConn = - 15;
public LLKMatrix(int h, int v, int s)
{
if ((v * h) % 2 == 0)
{
VSize = v;
HSize = h;
SeedCount = s;
initMatrix(HSize, VSize);
}
}
public int getAt(int x, int y)
{
if (x > HSize || x < 1 || y > VSize || y < 1)
{
return - 1;
}
else
{
return matrix[x - 1][y - 1];
}
}
public int setAt(int x, int y, int b)
{
if (x > HSize || x < 1 || y > VSize || y < 1)
{
return 0;
}
else
{
matrix[x - 1][y - 1] = b;
return 1;
}
}
public void shuffleMatrix()
{
Random r = new Random();
clearTrace();
for (int x = 0; x < HSize; x++)
{
for (int y = 0; y < VSize; y++)
{
int xx = Math.abs(r.nextInt()) % HSize;
int yy = Math.abs(r.nextInt()) % VSize;
int b = matrix[x][y];
matrix[x][y] = matrix[xx][yy];
matrix[xx][yy] = b;
}
}
}
public void clearTrace()
{
for (int x = 0; x < HSize; x++)
{
for (int y = 0; y < VSize; y++)
{
if (matrix[x][y] < - 1)
{
matrix[x][y] = - 1;
}
}
}
}
public int judge(int x, int y, int xx, int yy, boolean mark)
{
x--;
y--;
xx--;
yy--;
// outputMatrix(matrix);
if (x == xx && y == yy)
{
return 0;//同一个位置
}
if (x < 0 || x > HSize - 1 || y < 0 || y > VSize - 1 || xx < 0 || xx >
HSize - 1 || yy < 0 || yy > VSize - 1)
{
return 0;//不在区域
}
if (matrix[x][y] != matrix[xx][yy])
{
return 0;//不匹配
}
if (matrix[x][y] < 0 || matrix[xx][yy] < 0)
{
return 0;//空
}
int i;
int a;
if (x == xx)//同一列
{
if (y > yy)
{
int c = y;
y = yy;
yy = c;
}
a = 0;
for (i = y + 1; i < yy; i++)
{
a += matrix[x][i];
}
if ( - a == yy - y - 1)
{
if (mark)
{
for (i = y + 1; i < yy; i++)
{
matrix[x][i] = VConn;//纵向相连
}
}
return Score1;
}
}
if (y == yy)//同一行
{
if (x > xx)
{
int c = x;
x = xx;
xx = c;
}
a = 0;
for (i = x + 1; i < xx; i++)
{
a += matrix[i][y];
}
if ( - a == xx - x - 1)
{
if (mark)
{
for (i = x + 1; i < xx; i++)
{
matrix[i][y] = HConn;//横向相连
}
}
return Score1;
}
}//并排
a = 0;
if (x > xx)
{
int c = x;
x = xx;
xx = c;
c = y;
y = yy;
yy = c;
}
if (y < yy)
{
for (i = x + 1; i <= xx; i++)
{
a += matrix[i][y];
}
for (i = y + 1; i < yy; i++)
{
a += matrix[xx][i];
}
if ( - a == ((xx - x) + yy) - y - 1)
{
if (mark)
{
for (i = x + 1; i <= xx; i++)
{
matrix[i][y] = HConn;
}
for (i = y + 1; i < yy; i++)
{
matrix[xx][i] = VConn;
}
matrix[xx][y] = LDConn;
}
return Score2;
}
a = 0;
for (i = x; i < xx; i++)
{
a += matrix[i][yy];
}
for (i = y + 1; i < yy; i++)
{
a += matrix[x][i];
}
if ( - a == ((xx - x) + yy) - y - 1)
{
if (mark)
{
for (i = x; i < xx; i++)
{
matrix[i][yy] = HConn;
}
for (i = y + 1; i < yy; i++)
{
matrix[x][i] = VConn;
}
matrix[x][yy] = RUConn;
}
return Score2;
}
}
else
{
for (i = x + 1; i <= xx; i++)
{
a += matrix[i][y];
}
for (i = yy + 1; i < y; i++)
{
a += matrix[xx][i];
}
if ( - a == ((xx - x) + y) - yy - 1)
{
if (mark)
{
for (i = x + 1; i <= xx; i++)
{
matrix[i][y] = HConn;
}
for (i = yy + 1; i < y; i++)
{
matrix[xx][i] = VConn;
}
matrix[xx][y] = LUConn;
}
return Score2;
}
a = 0;
for (i = x; i < xx; i++)
{
a += matrix[i][yy];
}
for (i = yy + 1; i < y; i++)
{
a += matrix[x][i];
}
if ( - a == ((xx - x) + y) - yy - 1)
{
if (mark)
{
for (i = x; i < xx; i++)
{
matrix[i][yy] = HConn;
}
for (i = yy + 1; i < y; i++)
{
matrix[x][i] = VConn;
}
matrix[x][yy] = RDConn;
}
return Score2;
}
}
int y1;
int y2;
if (y > yy)
{
y1 = yy;
y2 = y;
}
else
{
y1 = y;
y2 = yy;
}
i = x;
for (int s = 0; Math.abs(s) < HSize;)
{
s = - s;
if (s >= 0)
{
s++;
}
i = x + s;
if (i < HSize && i >= 0)
{
a = 0;
for (int j = y1; j <= y2; j++)
{
a += matrix[i][j];
}
if ( - a == (y2 - y1) + 1)
{
a = 0;
if (x > i)
{
for (int c = i; c < x; c++)
{
a += matrix[c][y];
}
}
else
{
for (int c = x + 1; c <= i; c++)
{
a += matrix[c][y];
}
}
if ( - a == Math.abs(x - i))
{
a = 0;
if (xx > i)
{
for (int c = i; c < xx; c++)
{
a += matrix[c][yy];
}
}
else
{
for (int c = xx + 1; c <= i; c++)
{
a += matrix[c][yy];
}
}
if ( - a == Math.abs(xx - i))
{
if (mark)
{
if (x > i)
{
for (int c = i; c < x; c++)
{
matrix[c][y] = HConn;
}
if (y < yy)
{
matrix[i][y] = RDConn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -