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 }
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 }
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 }
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 }
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 }