• 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
    ",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
    %d %d
    ",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
    ",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
    ",st);
    43         else printf("%d step(s) before a loop of %d step(s)
    ",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);
    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
    ",cnt);
    49     }
    50     return 0;
    51 }
    View Code
  • 相关阅读:
    WPF程序设计 :第四章 按钮与其他控件(Buttons and Other Controls)
    C#参考 : 枚举类型
    C#3.0 新特性学习笔记(3):匿名类型
    F#语言2008年9月CTP版已经更新
    C#3.0 新特性学习笔记(1): 对象集合初始化器
    WPF程序设计基础:属性系统
    C#3.0 新特性学习笔记(2):var 隐式声明变量
    MSSql行列转换的Sql语法 详解与实例
    WPF程序设计 :第一章 应用程序和窗口(The Application and the Window)
    WPF程序设计 :第二章 基本画刷(Basic Brushes)
  • 原文地址:https://www.cnblogs.com/yijiull/p/6760140.html
Copyright © 2020-2023  润新知