import java.util.LinkedList;
public class IsLock
{
static int [][]arr1=new int[1000][4];
static int[][]arr0={{-1,1,-1,1},{1,-1,0,0},{0,0,1,-1}};
static LinkedList<Integer> dl = new LinkedList<Integer>();
static int []x={2,0,2,0};
public static void main(String args[])
{
dl.addLast(0);
for(int i=0;i<4;i++)
{
arr1[0][i]=x[i];
}
while(!dl.isEmpty())
{
pollArr(dl,arr1,x);//队列中弹出一个元素,对应的数据存储到临时容器数组x中
newPoint(arr1,x,dl); //弹出的节点对应进行操作,判断是否更新
Lock(x,arr0,dl);//对结点进行往下遍历操作判断是否产生死锁
}
for(int k=0;k<arr1[k].length;k++)
{
int count2=0,count3=0;
for(int y=0;y<4;y++)
{
count2++;
if(arr1[k][y]==0) count3++;
System.out.print(arr1[k][y]+"\r");
}
if(count3==4) break;
else if(count2==4) System.out.println();
}
}
//队列poll弹出元素,对应状态数组中对应的一组数据
public static void pollArr(LinkedList<Integer> dl,int[][] arr1, int[]x)
{
int a=dl.pollFirst();
for(int i=0;i<4;i++)
{
x[i]=arr1[a][i];
}
}
/* 更新状态结点 数组 */
// 判断结点是否是新结点
public static void newPoint(int arr[][],int x[],LinkedList<Integer> dl)
{
int n = 0;
for(int a=0;a<arr[a].length;a++)
{
int count2=0;
for(int b=0;b<arr[0].length;b++)
{
if(arr[a][b]==x[b])
count2++;
}
if (count2==4)
{
n=0;
break;
}
else if (a==(arr[a].length-1))
n=1;
}
//结点判断存储
if(n==1) //是新结点,更行状态数组
{
for(int i=0;i<arr[i].length;i++)
{
int count1=0;
for(int j=0;j<4;j++)
{
if (arr[i][j]!=0) break;
else count1++;
}
if(count1==4)
{
for(int j=0;j<4;j++) { arr[i][j]=x[j];
} } } }
else pollArr(dl,arr1,x);//不是新结点,调用队列弹出一组数据
}
//判断是否产生死锁
public static void Lock(int []x,int [][]arr0,LinkedList <Integer> dl)
{
int count=0;
for(int i=0;i<3;i++)
{
int k=0;
for(int j=0;j<4;j++)
{
int temp;
temp=x[j]+arr0[i][j];
if(temp<0)
{
count++;
k++;
break; }
else if(k==0) pollArr(dl,arr1,x);
}
}
if(count==3)
System.out.println("产生死锁");
} }