DFS

poj1979:(floodfill)http://poj.org/problem?id=1979

 1 #include<cstdio>
 2 #include<cstring>
 3 int dir[4][2]={0,1,0,-1,1,0,-1,0};
 4 int n,m;
 5 char p[25][25];
 6 int cnt=0;
 7 void dfs(int x,int y)
 8 {
 9     if(x<0||x>=n||y<0||y>=m||p[x][y]=='#') return ;
10     p[x][y]='#';
11     cnt++;
12     for(int i=0;i<4;i++)
13         dfs(x+dir[i][0],y+dir[i][1]);
14     return;
15 }
16 int main()
17 {
18     while(scanf("%d%d",&m,&n)&&(n||m))
19     {
20         cnt=0;
21         int sx,sy;
22         for(int i=0;i<n;i++)
23         {
24             scanf("%s",p[i]);
25             for(int j=0;j<m;j++)
26             {
27                 if(p[i][j]=='@') sx=i,sy=j;
28             }
29         }
30         dfs(sx,sy);
31         printf("%d\n",cnt);
32     }
33 }
View Code

poj1970:(floodfill)http://poj.org/problem?id=1970

 1 #include<cstdio>
 2 #include<cstring>
 3 int dir[4][2]={0,1,1,0,1,1,-1,1};
 4 int p[22][22];
 5 int k;
 6 int dfs(int x,int y)
 7 {
 8     for(int i=0;i<4;i++) //四种方式
 9     {
10 
11         int ok=1;
12         int dx=x,dy=y; //
13         for(int j=0;j<4;j++) //接着走四步
14         {
15              dx=dx+dir[i][0];
16              dy=dy+dir[i][1];
17             if(dx<1||dx>19||dy<1||dy>19||p[dx][dy]!=k)
18             {
19                 ok=0;
20                 break;
21             }
22         }
23         if(ok&&p[x-dir[i][0]][y-dir[i][1]]!=k&&p[dx+dir[i][0]][dy+dir[i][1]]!=k)
24         {
25             printf("%d\n%d %d\n",k,x,y);
26             return 1;
27         }
28     }
29     return 0;
30 }
31 int main()
32 {
33     int t;
34     scanf("%d",&t);
35     while(t--)
36     {
37         for(int i=1;i<=19;i++)
38             for(int j=1;j<=19;j++)
39             scanf("%d",&p[i][j]);
40         int flag=0;
41         for(int i=1;i<=19&&flag!=1;i++)
42             for(int j=1;j<=19&&flag!=1;j++)
43             if(p[i][j]!=0)
44             {
45                 k=p[i][j];
46                 if(dfs(i,j)) flag=1;
47             }
48         if(!flag) puts("0");
49     }
50     return 0;
51 }
View Code

 poj1330:(LCA) http://poj.org/problem?id=1330

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<algorithm>
  5 using namespace std;
  6 const int maxn=10010;
  7 int  first[maxn<<1],node[maxn<<1],dep[maxn<<1];
  8 int dp[maxn<<1][26];
  9 int head[maxn];
 10 int vis[maxn],in[maxn];
 11 int cnt=0,tot=0;
 12 struct edge
 13 {
 14     int v,nex;
 15 }e[maxn];
 16 int n;
 17 void add(int u,int v)
 18 {
 19     e[cnt].v=v;
 20     e[cnt].nex=head[u];
 21     head[u]=cnt++;
 22 }
 23 void init()
 24 {
 25     cnt=0;
 26     tot=0;
 27     for(int i=0;i<=n;i++)
 28     {
 29         head[i]=-1;
 30         vis[i]=0;
 31         in[i]=0;
 32     }
 33 }
 34 void dfs(int u,int d)
 35 {
 36     tot++;
 37     node[tot]=u;
 38     dep[tot]=d;
 39     first[u]=tot;
 40     vis[u]=1;
 41     for(int i=head[u];i!=-1;i=e[i].nex)
 42     {
 43         int v=e[i].v;
 44         if(!vis[v]) dfs(v,d+1);
 45         tot++;
 46         node[tot]=u;
 47         dep[tot]=d;
 48     }
 49     return;
 50 }
 51 void RMQ_INIT(int n)
 52 {
 53     int k=0;
 54     while(1<<(k+1)<=n) k++;
 55     for(int i=1;i<=n;i++) dp[i][0]=i;
 56     for(int j=1;j<=k;j++)
 57         for(int i=1;i+(1<<j)-1<=n;i++)
 58     {
 59         int a=dp[i][j-1];
 60         int b=dp[i+(1<<j-1)][j-1];
 61         if(dep[a]<=dep[b]) dp[i][j]=a;
 62         else dp[i][j]=b;
 63     }
 64     return;
 65 }
 66 int rmq(int x,int y)
 67 {
 68     int k=0;
 69     while(1<<(k+1)<=(y-x+1)) k++;
 70     int a=dp[x][k];
 71     int b=dp[y-(1<<k)+1][k];
 72     if(dep[a]<=dep[b]) return a;
 73     else return b;
 74 }
 75 int lca(int a,int b)
 76 {
 77     int x=first[a];
 78     int y=first[b];
 79     if(x>y) swap(x,y);
 80     return node[rmq(x,y)];
 81 }
 82 int main()
 83 {
 84     int t;
 85     scanf("%d",&t);
 86     while(t--)
 87     {
 88         scanf("%d",&n);
 89         init();
 90         int u,v;
 91         for(int i=0;i<n-1;i++)
 92         {
 93             scanf("%d%d",&u,&v);
 94             in[v]=1;
 95             add(u,v);
 96         }
 97         for(int i=1;i<=n;i++) if(!in[i])
 98         {
 99             dfs(i,1);
100             break;
101         }
102         RMQ_INIT(tot);
103         scanf("%d%d",&u,&v);
104         printf("%d\n",lca(u,v));
105     }
106 }
View Code

 poj1573:(模拟)http://poj.org/problem?id=1573

 1 #include<cstdio>
 2 #include<cstring>
 3 char p[15][15];
 4 int d[15][15],vis[15][15];
 5 int st,cir;
 6 int n,m,y;
 7 
 8 void dfs(int x,int y,int sd)
 9 {
10     if(p[x][y]=='N') x--;
11     else if(p[x][y]=='S') x++;
12     else if(p[x][y]=='W') y--;
13     else if(p[x][y]=='E') y++;
14     sd++;
15     if(x<0||x>=n||y<0||y>=m)
16     {
17         st=sd;
18         cir=-1;
19         return;
20     }
21     if(vis[x][y])
22     {
23         st=d[x][y];
24         cir=sd-st;
25         return;
26     }
27     d[x][y]=sd;
28     vis[x][y]=1;
29     dfs(x,y,sd);
30 }
31 int main()
32 {
33     while(scanf("%d%d%d",&n,&m,&y)&&(n||m||y))
34     {
35         memset(vis,0,sizeof(vis));
36         for(int i=0;i<n;i++)
37             scanf("%s",p[i]);
38         y--;
39         d[0][y]=0;
40         vis[0][y]=1;
41         dfs(0,y,0);
42         if(cir==-1) printf("%d step(s) to exit\n",st);
43         else printf("%d step(s) before a loop of %d step(s)\n",st,cir);
44 
45     }
46 }
View Code

 poj1950:(枚举)http://poj.org/problem?id=1950

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<set>
 4 #include<iostream>
 5 #include<cctype>
 6 #include<string>
 7 #include<sstream>
 8 #include<algorithm>
 9 #include<map>
10 #define LL long long
11 using namespace std;
12 int n,cnt,k;
13 char str[26];
14 void dfs(LL sum,LL last,int pos)
15 {
16     if(pos==n+1)
17     {
18         if(sum==0)
19         {
20             cnt++;
21             if(cnt<=20){
22                 for(int i=1;i<n;i++)
23                     printf("%d %c ",i,str[i]);
24             printf("%d\n",n);
25             }
26         }
27         return ;
28     }
29     str[pos-1]='+';
30     dfs(sum+pos,pos,pos+1);
31     str[pos-1]='-';
32     dfs(sum-pos,-pos,pos+1);
33     str[pos-1]='.';
34     if(pos>=10) k=100;
35     else k=10;
36     if(last<0)
37         dfs(sum-last+last*k-pos,last*k-pos,pos+1);
38     else if(last>0)
39         dfs(sum-last+last*k+pos,last*k+pos,pos+1);
40 }
41 
42 int main()
43 {
44     while(scanf("%d",&n)!=EOF)
45     {
46         cnt=0;
47         dfs(1,1,2);
48         printf("%d\n",cnt);
49     }
50     return 0;
51 }
View Code

 

posted @ 2017-04-25 08:48  yijiull  阅读(88)  评论(0编辑  收藏  举报