点击(此处)折叠或打开
- #include <iostream>
- #include <stdio.h>
- #include <cstring>
-
- using namespace std;
-
- int p,q;
- int si,sj;
- #define MAX_V (20+1)
- #define MAX_L (10)
- int T[MAX_V][MAX_V];
- #define inf (2000000000)
-
- struct move{
- int i;
- int j;
- }MOVE[4]={{0,1},{1,0},{0,-1},{-1,0}};
-
- int isValid(int i,int j)
- {
- if(i < 1 || i> q)
- return 0;
- if(j < 1 || j> p)
- return 0;
-
- return 1;
- }
-
- #define printf //
- int dfs(int i,int j,int t[][MAX_V],int l) //l表示当前步数
- {
-
- if(l > MAX_L)
- return -1;
-
- int mi,mj,lmi,lmj;
- int minp=inf;
-
- printf("\n%d-------------------------------------------\n",l);
- printf("\nfrom (%d,%d)=%d\n\n",i,j,t[i][j]);
-
- for(int m=0;m<4;m++)
- {
- mi=i;
- mj=j;
- bool bFirstAdj=true;
-
- printf("\n m=%d\n\n",m);
- while(true)
- {
- lmi=mi;
- lmj=mj;
- mi += MOVE[m].i;
- mj += MOVE[m].j;
-
- //printf("try (%d,%d)\n",mi,mj);
- if(!isValid(mi,mj))
- break;
-
- printf("t[%d][%d]=%d\n",mi,mj,t[mi][mj]);
- if(t[mi][mj] == 1)
- {
- if(bFirstAdj)
- {
- printf("first block break....\n");
- break;
- }
-
- int tmp[MAX_V][MAX_V];
- memcpy(tmp,t,sizeof(tmp));
- tmp[mi][mj]=0;
-
- printf("set (%d,%d)=%d\n",mi,mj,tmp[mi][mj]);
-
- int ret = dfs(lmi,lmj,tmp,l+1);
-
- if(ret != -1)
- {
- if(ret < minp)
- {
- minp = ret;
- printf("(%d,%d) ret =%d < minp=%d",mi,mj,ret,minp);
- }
- }
-
- break;
- }
- else if(t[mi][mj] == 3)
- {
- return l;
- }
-
- bFirstAdj=false;
- }
-
- }
-
- if(minp == inf)
- return -1;
- return minp;
- }
-
- int main()
- {
- while(cin>>p>>q)
- {
- if( p == 0 )
- break;
-
- for(int i=1;i<=q;i++)
- {
- for(int j=1;j<=p;j++)
- {
- cin >>T[i][j];
- if(T[i][j] == 2)
- {
- si=i;
- sj=j;
- //printf("si=%d,sj=%d\n",si,sj);
- }
- }
- }
-
- printf("---------------------------------------\n");
- cout<<dfs(si,sj,T,1)<<endl;
- printf("---------------------------------------\n");
- }
- }
相关热门文章
给主人留下些什么吧!~~
评论热议