poj3009Curling 2.0(dfs)

View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int board[110][110];
 6 int di,dj,xi,xj,n,m,num,dis[4][2] = {0,1,0,-1,1,0,-1,0};
 7 void dfs(int v,int x,int y)
 8 {
 9     int i,tx,ty,flag = 0;
10     if(v>10)
11     return ;
12     for(i = 0 ; i < 4 ; i++)
13     {
14         tx = x;
15         ty = y;
16         flag = 0;
17         if(board[x+dis[i][0]][y+dis[i][1]]==1)
18         continue;
19         while(1)
20         {
21             tx = tx+dis[i][0];
22             ty = ty+dis[i][1];
23             if(tx<0||tx>n||ty<0||ty>m)
24             break;
25             if(board[tx][ty]==3)
26             {
27                 if(num>v)
28                 num = v;
29                 break;
30             }
31             if(board[tx][ty]==1)
32             {
33                 flag = 1;
34                 break;
35             }
36         }
37         if(flag)
38         {
39             board[tx][ty] = 0;
40             dfs(v+1,tx-dis[i][0],ty-dis[i][1]);
41             board[tx][ty] = 1;
42         }
43     }
44 }
45 int main()
46 {
47     int i,j;
48     while(cin>>m>>n)
49     {
50         if(m==0&&n==0)
51         break;
52         num = 15;
53         for(i = 1; i <= n ; i++)
54         for(j = 1; j <= m ; j++)
55         {
56             cin>>board[i][j];
57             if(board[i][j]==2)
58             {
59                 xi = i;
60                 xj = j;
61             }
62             if(board[i][j]==3)
63             {
64                 di = i;
65                 dj = j;
66             }
67         }
68         dfs(1,xi,xj);
69         if(num>10)
70         cout<<"-1\n";
71         else
72         cout<<num<<endl;
73     }
74     return 0;
75 }


 

http://poj.org/problem?id=3009

求最短 直接就用了BFS 结果ME 后有看了人家写的dfs 写了一份dfs 更新最小值

 

View Code
  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 using namespace std;
  5 char s[50][50],so[2];
  6 int pr[5],dis[4][2]={-1,0,0,-1,1,0,0,1},vis[50][50],n,m,flag;
  7 int dir[2][4][4] = {{{1, 0, 3, 2}, {2, 1, 0, 3}, {3, 2, 1, 0}, {0, 3, 2, 1}},{{3, 0, 1, 2}, {0, 1, 2, 3}, {1, 2, 3, 0}, {2, 3, 0, 1}}};
  8 struct node
  9 {
 10     int x,y,num;
 11 }q[100010];
 12 int judge(int x,int y)
 13 {
 14     if(x<1||x>n||y<1||y>m)
 15     return 0;
 16     if(s[x][y]=='#')
 17     return 0;
 18     return 1;
 19 }
 20 void bfs()
 21 {
 22     int i,j,p = 0, d = 1;
 23     memset(vis,0,sizeof(vis));
 24     q[d].x = so[0];
 25     q[d].y = so[1];
 26     q[d].num = 1;
 27     while(p!=d)
 28     {
 29         p++;
 30         int tx = q[p].x;
 31         int ty = q[p].y;
 32         int tnum = q[p].num;
 33         if(s[tx][ty]=='E')
 34         {
 35             pr[2] = tnum;
 36             break;
 37         }
 38         for(i = 0 ; i < 4 ; i++)
 39         {
 40             int nx = tx+dis[i][0];
 41             int ny = ty+dis[i][1];
 42             if(!vis[nx][ny]&&judge(nx,ny))
 43             {
 44                 vis[nx][ny] = 1;
 45                 d++;
 46                 q[d].x = nx;
 47                 q[d].y = ny;
 48                 q[d].num = tnum+1;
 49             }
 50         }
 51     }
 52 }
 53 void dfs(int x,int y,int d,int f)
 54 {
 55     pr[f]++;
 56     if(s[x][y]=='E')
 57         return ;
 58     int i,j;
 59     if(f==1)
 60     cout<<x<<" "<<y<<endl;
 61     for(j = 0 ; j < 4 ; j++)
 62     {
 63         int td = dir[f][d][j];
 64         int tx = x+dis[td][0];
 65         int ty = y+dis[td][1];
 66         if(!vis[tx][ty]&&judge(tx,ty))
 67         {
 68               vis[tx][ty] = 1;
 69               dfs(tx,ty,td,f);
 70         }
 71     }
 72 }
 73 int main()
 74 {
 75     int i,j,k,t,in;
 76     cin>>t;
 77     while(t--)
 78     {
 79         cin>>m>>n;
 80         pr[0] = 1;
 81         pr[1] = 1;
 82         for(i = 1 ; i <= n ; i++)
 83         {
 84             getchar();
 85             for(j = 1 ; j <= m ; j++)
 86             {
 87                 cin>>s[i][j];
 88                 if(s[i][j]=='S')
 89                 {
 90                     so[0] = i;
 91                     so[1] = j;
 92                     if(so[0]==n)
 93                     in = 0;
 94                     if(so[0]==1)
 95                     in = 2;
 96                     if(so[1]==m)
 97                     in = 1;
 98                     if(so[1]==1)
 99                     in = 3;
100                 }
101             }
102         }
103         bfs();
104         for(i = 0 ; i < 2 ; i++)
105         {
106             memset(vis,0,sizeof(vis));
107             vis[so[0]+dis[in][0]][so[1]+dis[in][1]] = 1;
108             dfs(so[0]+dis[in][0],so[1]+dis[in][1],in,i);
109         }
110         cout<<pr[0]<<" "<<pr[1]<<" "<<pr[2]<<endl;
111     }
112     return 0;
113 }

 

posted @ 2013-01-21 17:27  _雨  阅读(143)  评论(0编辑  收藏  举报