5 5 5 0 1 0 0 0 0 0 0 0 0 0 2 0 9 0 0 0 0 0 0 0 9 -1 0 -2 4 6 -1 -2 1 0 9 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 4 0 0 0 0 0 0 0 9 2 0 1 0 0 0 9 0 0 9 0 0 0 0 0 0 -1 0 -2 0 4 7 0 0 0 0 0 0 0 0 0 1 9 0 0 0 0 0 0 0 0 0 0 9 2 -1 9 0 0 -2 10 10 0 0 0 0 0 0 0 9 -1 0 0 9 -2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 9 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 9 9 9 0 0 0 0 0 9 0 0 0 #include<stdio.h> #include<stdlib.h> int row,col; int data[12][12] = {0}; int Dx[4] = {1,-1,0,0};//下,上,左,右 int Dy[4] = {0,0,-1,1}; int sox,soy; int stx,sty; int eox,eoy; int etx,ety; int min = 8; bool ret = false; void DFS(int ox,int oy,int tx,int ty,int step,int I); int main() { for(int i = 0;i < 12;i++) { for(int j = 0;j < 12;j++) { data[i][j] = 9; } } int n; freopen("qipanhuakuai.txt","r",stdin); scanf("%d",&n); for(int t = 0;t < n;t++) { scanf("%d",&row); scanf("%d",&col); for(int i = 1;i <= row;i++) { for(int j = 1;j <= col;j++) { scanf("%d",&data[i][j]); if(data[i][j] == 1){ sox = i; soy = j; }else if(data[i][j] == 2){ stx = i; sty = j; }else if(data[i][j] == -1){ data[i][j] = 0; eox = i; eoy = j; } else if(data[i][j] == -2){ data[i][j] = 0; etx = i; ety = j; } } } DFS(sox,soy,stx,sty,0,-1); if(ret) { printf("%d\n",min); }else{ printf("%d\n",-1); } ret = false; min = 8; for(int i = 1;i <= row;i++) { for(int j = 1;j <= col;j++) { data[i][j] = 9; } } } return 0; } void DFS(int ox,int oy,int tx,int ty,int step,int I) { if(ox == eox && oy == eoy && tx == etx && ty == ety) { //printf("%d\t",step); ret = true; if(step < min) { min = step; } return; } if(step >= 8) { return; } int lx = ox,ly = oy,rx = tx,ry = ty; data[lx][ly] = 0; data[rx][ry] = 0; for(int i = 0;i < 4;i++) { if(i == I) { continue; } if(i == 0){ if(lx > rx){ while(1){ if(data[lx + Dx[i]][ly] != 9) { data[lx][ly] = 0; lx += Dx[i]; } else{ data[lx][ly] = 1; break; } } while(1){ if(data[rx + Dx[i]][ry] != 9 && data[rx + Dx[i]][ry] != 1) { data[rx][ry] = 0; rx += Dx[i]; } else{ data[rx][ry] = 2; break; } } } else if(lx <= rx){ while(1){ if(data[rx + Dx[i]][ry] != 9) { data[rx][ry] = 0; rx += Dx[i]; } else{ data[rx][ry] = 2; break; } } while(1){ if(data[lx + Dx[i]][ly] != 9 && data[lx + Dx[i]][ly] != 2) { data[lx][ly] = 0; lx += Dx[i]; } else{ data[lx][ly] = 1; break; } } } DFS(lx,ly,rx,ry,step + 1,i); data[lx][ly] = 0; data[rx][ry] = 0; lx = ox; ly = oy; rx = tx; ry = ty; data[lx][ly] = 1; data[rx][ry] = 2; } else if(i == 1){ if(lx > rx){ while(1){ if(data[rx + Dx[i]][ry] != 9) { data[rx][ry] = 0; rx += Dx[i]; } else{ data[rx][ry] = 2; break; } } while(1){ if(data[lx + Dx[i]][ly] != 9 && data[lx + Dx[i]][ly] != 2) { data[lx][ly] = 0; lx += Dx[i]; } else{ data[lx][ly] = 1; break; } } } else if(lx <= rx){ while(1){ if(data[lx + Dx[i]][ly] != 9) { data[lx][ly] = 0; lx += Dx[i]; } else{ data[lx][ly] = 1; break; } } while(1){ if(data[rx + Dx[i]][ry] != 9 && data[rx + Dx[i]][ry] != 1) { data[rx][ry] = 0; rx += Dx[i]; } else{ data[rx][ry] = 2; break; } } } DFS(lx,ly,rx,ry,step + 1,i); data[lx][ly] = 0; data[rx][ry] = 0; lx = ox; ly = oy; rx = tx; ry = ty; data[lx][ly] = 1; data[rx][ry] = 2; } else if(i == 2){ if(ly > ry){ while(1){ if(data[rx][ry + Dy[i]] != 9) { data[rx][ry] = 0; ry += Dy[i]; } else{ data[rx][ry] = 2; break; } } while(1){ if(data[lx][ly + Dy[i]] != 9 && data[lx][ly + Dy[i]] != 2) { data[lx][ly] = 0; ly += Dy[i]; } else{ data[lx][ly] = 1; break; } } } else if(ly <= ry){ while(1){ if(data[lx][ly + Dy[i]] != 9) { data[lx][ly] = 0; ly += Dy[i]; } else{ data[lx][ly] = 1; break; } } while(1){ if(data[rx][ry + Dy[i]] != 9 && data[rx][ry + Dy[i]] != 1) { data[rx][ry] = 0; ry += Dy[i]; } else{ data[rx][ry] = 2; break; } } } DFS(lx,ly,rx,ry,step + 1,i); data[lx][ly] = 0; data[rx][ry] = 0; lx = ox; ly = oy; rx = tx; ry = ty; data[lx][ly] = 1; data[rx][ry] = 2; } else if(i == 3){ if(ly > ry){ while(1){ if(data[lx][ly + Dy[i]] != 9) { data[lx][ly] = 0; ly += Dy[i]; } else{ data[lx][ly] = 1; break; } } while(1){ if(data[rx][ry + Dy[i]] != 9 && data[rx][ry + Dy[i]] != 1) { data[rx][ry] = 0; ry += Dy[i]; } else{ data[rx][ry] = 2; break; } } } else if(ly <= ry){ while(1){ if(data[rx][ry + Dy[i]] != 9) { data[rx][ry] = 0; ry += Dy[i]; } else{ data[rx][ry] = 2; break; } } while(1){ if(data[lx][ly + Dy[i]] != 9 && data[lx][ly + Dy[i]] != 2) { data[lx][ly] = 0; ly += Dy[i]; } else{ data[lx][ly] = 1; break; } } } DFS(lx,ly,rx,ry,step + 1,i); data[lx][ly] = 0; data[rx][ry] = 0; lx = ox; ly = oy; rx = tx; ry = ty; data[lx][ly] = 1; data[rx][ry] = 2; } } }