Algorithm 纸牌SPOJ的优化

Algorithm 纸牌SPOJ的优化,algorithm,graph-algorithm,graph-traversal,breadth-first-search,Algorithm,Graph Algorithm,Graph Traversal,Breadth First Search,问题代码:SOLIT 问题链接: 我试着解决SPOJ问题——纸牌。然而,我最终得到了一个TLE(超过了时间限制)。我当前的解决方案大约需要2秒来执行。我不知道如何进一步优化解决方案以缩短时间。因此,如果能在这方面提供任何帮助,我将不胜感激 链接到我的解决方案: 导入java.io.BufferedReader; 导入java.io.BufferedWriter; 导入java.io.FileDescriptor; 导入java.io.FileOutputStream; 导入java.io.IOE

问题代码:SOLIT
问题链接:

我试着解决SPOJ问题——纸牌。然而,我最终得到了一个TLE(超过了时间限制)。我当前的解决方案大约需要2秒来执行。我不知道如何进一步优化解决方案以缩短时间。因此,如果能在这方面提供任何帮助,我将不胜感激

链接到我的解决方案:

导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.FileDescriptor;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.OutputStreamWriter;
导入java.util.HashSet;
导入java.util.LinkedList;
导入java.util.Queue;
导入java.util.StringTokenizer;
班级纸牌{
枚举方向{
上、右、下、左;
};
静态类块{
int row,col;
公共件(整行、整列){
this.row=行;
this.col=col;
}
@凌驾
公共布尔等于(对象o)
{
如果(!(工件的实例))
返回false;
件p=(件)o;
返回(row==p.row&&col==p.col);
}
@凌驾
公共int hashCode()
{
返回(行*10+列)%11;
}
}
静态类状态{
散列集;
公共国家(){
片段=新哈希集(11);
}
公共州(s州){
片段=新哈希集(11);
用于(件p:s.件)
添加(新件(p.row,p.col));
}
@凌驾
公共布尔等于(对象o){
如果(!(o状态实例))
返回false;
状态s=(状态)o;
如果(件数.size()!=s.pieces.size())
返回false;
用于(件号p:件号)
{
如果(!s.pieces.包含(p))
返回false;
}
返回true;
}
@凌驾
公共int hashCode(){
最终整数模=100000007;
长代码=0;
用于(件号p:件号){
code=(code+p.hashCode())%MOD;
}
返回(int)代码;
}
@凌驾
公共字符串toString()
{
字符串res=“”;
用于(件号p:件号)
res=res+”(“+p.row+”,“+p.col+”);
返回res;
}
公共int getCloseness(状态s)
{
int medianRow=0,medianCol=0,sMedianRow=0,sMedianCol=0;
用于(件号p:件号)
{
medianRow+=p.row;
medianCol+=p.col;
}
中速/=4;
medianCol/=4;
用于(件p:s.件)
{
sMedianRow+=p.row;
sMedianCol+=p.col;
}
sMedianRow/=4;
sMedianCol/=4;
int贴近度=((sMedianCol medianCol)*(sMedianCol medianCol))+((sMedianRow medianRow)*(sMedianRow medianRow));
回归贴近度;
}
}
静态makeMove(状态curr、工件、方向dir、HashSet){
if(dir==Direction.TOP){
如果(件号行==1)
返回null;
if(当前件数包含(新件数(件数行-1,件数列)))
{
if(piece.row==2 | | curr.pieces.contains(新的piece(piece.row-2,piece.col)))
返回null;
其他的
{
状态newState=新状态(当前);
newState.pieces.remove(新条(条.行,条.列));
newState.pieces.add(新的片段(Piece.row-2,Piece.col));
如果(已访问.包含(新闻状态))
返回null;
其他的
返回新闻状态;
}
}
其他的
{
状态newState=新状态(当前);
newState.pieces.remove(新条(条.行,条.列));
newState.pieces.add(新片段(Piece.row-1,Piece.col));
如果(已访问.包含(新闻状态))
返回null;
其他的
返回新闻状态;
}
}
else if(dir==Direction.RIGHT){
如果(件号列==8)
返回null;
if(当前工件包含(新工件(工件行、工件列+1)))
{
if(piece.col==7 | | curr.pieces.contains(新的piece(piece.row,piece.col+2)))
返回null;
其他的
{
状态newState=新状态(当前);
newState.pieces.remove(新条(条.行,条.列));
newState.pieces.add(新片段(Piece.row,Piece.col+2));
如果(已访问.包含(新闻状态))
返回null;
其他的
返回新闻状态;
}
}
其他的
{
状态newState=新状态(当前);
newState.pieces.remove(新条(条.行,条.列));
newState.pieces.add(新片段(Piece.row,Piece.col+1));
如果(已访问.包含(新闻状态))
返回null;
其他的
返回新闻状态;
}
}
else if(dir==Direction.DOWN){
如果(件号行==8)
返回null;
if(当前工件包含(新工件(工件行+1,工件列)))
{
if(piece.row==7 | | curr.pieces.contains(新的piece(piece.row+2,piece.col)))
返回null;
其他的
{
状态newState=新状态(当前);