http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2718
模拟
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int w[25][25]; 7 int dis[4][2] = {1,0,0,-1,0,1,-1,0}; 8 int main() 9 { 10 int n,m,k,i,s1,s2,kk=0,d; 11 while(cin>>n>>m>>k) 12 { 13 memset(w,0,sizeof(w)); 14 kk++; 15 if(!n&&!m&&!k) break; 16 for(i = 1; i <= k ; i++) 17 { 18 int x,y; 19 cin>>x>>y; 20 w[x][y] = 1; 21 } 22 cin>>s1>>s2; 23 int num=0; 24 if(s1==1) 25 d = 0; 26 else if(s2==1) 27 d = 2; 28 else if(s1==n) 29 d = 3; 30 else if(s2==m) 31 d = 1; 32 printf("Case %d: ",kk); 33 int tx = s1,ty=s2,dd=d; 34 num=1; 35 while(1) 36 { 37 if(tx==1||ty==1||tx==n||ty==m) 38 { 39 if(tx==1&&d==3) 40 {printf("%d %d %d ",tx,ty,num);break;} 41 else if(ty==1&&d==1) 42 {printf("%d %d %d ",tx,ty,num);break;} 43 else if(tx==n&&d==0) 44 {printf("%d %d %d ",tx,ty,num);break;} 45 else if(ty==m&&d==2) 46 {printf("%d %d %d ",tx,ty,num);break;} 47 } 48 int ox = dis[d][0]+tx; 49 int oy = dis[d][1]+ty; 50 if(w[ox][oy]) 51 { 52 if(d==0) 53 { 54 d = 1; 55 ox = dis[d][0]+tx; 56 oy = dis[d][1]+ty; 57 if(w[ox][oy]) 58 { 59 d = 2; 60 ox = dis[d][0]+tx; 61 oy = dis[d][1]+ty; 62 if(w[ox][oy]) 63 d = 3; 64 } 65 } 66 else if(d==1) 67 { 68 d = 3; 69 ox = dis[d][0]+tx; 70 oy = dis[d][1]+ty; 71 if(w[ox][oy]) 72 { 73 d = 0; 74 ox = dis[d][0]+tx; 75 oy = dis[d][1]+ty; 76 if(w[ox][oy]) 77 d = 2; 78 } 79 } 80 else if(d==3) 81 { 82 d = 2; 83 ox = dis[d][0]+tx; 84 oy = dis[d][1]+ty; 85 if(w[ox][oy]) 86 { 87 d = 1; 88 ox = dis[d][0]+tx; 89 oy = dis[d][1]+ty; 90 if(w[ox][oy]) 91 d = 0; 92 } 93 } 94 else 95 { 96 if(d==2) 97 { 98 d = 0; 99 ox = dis[d][0]+tx; 100 oy = dis[d][1]+ty; 101 if(w[ox][oy]) 102 { 103 d = 3; 104 ox = dis[d][0]+tx; 105 oy = dis[d][1]+ty; 106 if(w[ox][oy]) 107 d = 1; 108 } 109 } 110 } 111 } 112 else 113 { 114 num++; 115 tx = ox; 116 ty = oy; 117 } 118 } 119 } 120 return 0; 121 } 122 123 124 125 126 /************************************** 127 Problem id : SDUT OJ 2718 128 User name : shang 129 Result : Accepted 130 Take Memory : 472K 131 Take Time : 0MS 132 Submit Time : 2013-12-01 10:48:41 133 **************************************/
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2719
水题
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<queue> 7 #include<vector> 8 using namespace std; 9 int ma[3][1010]; 10 int main() 11 { 12 int n,m,k,a,kk=0,i; 13 while(cin>>n>>m>>k) 14 { 15 if(!n&&!m&&!k) 16 break; 17 memset(ma,0,sizeof(ma)); 18 kk++; 19 for(i = 1; i <= k ; i++) 20 { 21 scanf("%d",&a); 22 int k = a%n,t = 1,q = a; 23 while(ma[t][k]) 24 { 25 int y = ma[t][k]; 26 ma[t][k] = q; 27 q = y; 28 if(t==1) 29 { 30 t = 2; 31 k = y%m; 32 } 33 else 34 { 35 t = 1; 36 k = y%n; 37 } 38 } 39 ma[t][k] = q; 40 } 41 printf("Case %d: ",kk); 42 for(i = 0 ; i < n ; i++) 43 { 44 if(ma[1][i]) 45 break; 46 } 47 if(i!=n) 48 puts("Table 1"); 49 for(i = 0 ; i < n ; i++) 50 { 51 if(ma[1][i]) 52 printf("%d:%d ",i,ma[1][i]); 53 } 54 for(i = 0 ; i < m ; i++) 55 { 56 if(ma[2][i]) 57 break; 58 } 59 if(i!=m) 60 puts("Table 2"); 61 for(i = 0 ; i < m ; i++) 62 { 63 if(ma[2][i]) 64 printf("%d:%d ",i,ma[2][i]); 65 } 66 } 67 return 0; 68 } 69 70 71 72 73 /************************************** 74 Problem id : SDUT OJ 2719 75 User name : shang 76 Result : Accepted 77 Take Memory : 500K 78 Take Time : 0MS 79 Submit Time : 2013-12-01 11:12:16 80 **************************************/
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2721
模拟 消行消列 bfs去元素
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<queue> 7 #include<vector> 8 9 using namespace std; 10 int a[15][15],vis[15][15]; 11 int dis[4][2] = {0,1,0,-1,1,0,-1,0}; 12 struct node 13 { 14 int x,y; 15 }; 16 void init() 17 { 18 int i,j; 19 for(i = 2; i <= 12 ; i++) 20 { 21 for(j = 1; j <= 10 ; j++) 22 if(a[i][j]&&!a[i-1][j]) 23 { 24 int p = i-1; 25 while(p>=1&&!a[p][j]) 26 p--; 27 a[p+1][j] = a[i][j]; 28 a[i][j] = 0; 29 } 30 } 31 for(i = 2; i <= 10 ; i++) 32 { 33 if(a[1][i]&&!a[1][i-1]) 34 { 35 int p = i-1; 36 while(p>=1&&!a[1][p]) 37 p--; 38 int tt = 1; 39 while(tt<=12&&a[tt][i]) 40 { 41 a[tt][p+1] = a[tt][i]; 42 a[tt][i] = 0; 43 tt+=1; 44 } 45 } 46 } 47 } 48 void bfs(int x,int y) 49 { 50 if(!a[x][y]) return ; 51 memset(vis,0,sizeof(vis)); 52 node te,tt; 53 te.x = x; 54 te.y = y; 55 queue<node>q; 56 q.push(te); 57 int num = 1; 58 vis[x][y] = 1; 59 while(!q.empty()) 60 { 61 tt = q.front(); 62 q.pop(); 63 for(int i = 0 ; i < 4 ; i++) 64 { 65 int tx = tt.x+dis[i][0]; 66 int ty = tt.y+dis[i][1]; 67 if(tx>=1&&tx<=12&&ty>=1&&ty<=10&&!vis[tx][ty]&&a[tx][ty]==a[x][y]) 68 { 69 vis[tx][ty] = 1; 70 te.x = tx; 71 te.y = ty; 72 num++; 73 q.push(te); 74 } 75 } 76 } 77 int i,j; 78 if(num>=3) 79 { 80 for(i = 1; i <= 12 ; i++) 81 for(j = 1; j <= 10 ; j++) 82 if(vis[i][j]) 83 a[i][j] = 0; 84 } 85 init(); 86 } 87 int main() 88 { 89 int n,i,j,u; 90 char c; 91 while(cin>>n) 92 { 93 if(!n) break; 94 for(i = 12; i >= 1 ; i--) 95 for(j = 1 ;j <= 10 ; j++) 96 { 97 cin>>c; 98 a[i][j] = c-'A'+1; 99 } 100 init(); 101 for(i = 1; i <= n ;i++) 102 { 103 cin>>c>>u; 104 int v = c-'a'+1; 105 bfs(u,v); 106 } 107 int ans = 0; 108 for(i = 1; i <= 12 ; i++) 109 for(j = 1; j <= 10 ; j++) 110 if(a[i][j]) 111 ans++; 112 cout<<ans<<endl; 113 } 114 return 0; 115 } 116 117 118 119 120 /************************************** 121 Problem id : SDUT OJ 2721 122 User name : shang 123 Result : Accepted 124 Take Memory : 460K 125 Take Time : 0MS 126 Submit Time : 2013-12-01 12:50:28 127 **************************************/
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2723
枚举每条边 所存在除这条边以外的可以连接的路 就去掉这条边 水题
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<queue> 7 #include<vector> 8 #include<map> 9 #include<string> 10 using namespace std; 11 char s1[210],s2[210],s[210][210]; 12 map<string,int>f; 13 vector<int>ed[210]; 14 int w[210][210],vis[210],g; 15 struct node 16 { 17 char s1[210],s2[210]; 18 }pp[40010],p[40010]; 19 int dfs(int u,int v) 20 { 21 queue<int>q; 22 q.push(u); 23 vis[u] = 1; 24 while(!q.empty()) 25 { 26 int k = q.front(); 27 q.pop(); 28 if(k==v) return 1; 29 for(int i = 0; i < (int)ed[k].size() ; i++) 30 { 31 if(w[k][ed[k][i]]&&!vis[ed[k][i]]) 32 { 33 vis[ed[k][i]] = 1; 34 q.push(ed[k][i]); 35 } 36 } 37 } 38 return 0; 39 } 40 bool cmp(node a,node b) 41 { 42 if(strcmp(a.s1,b.s1)==0) 43 return strcmp(a.s2,b.s2)<0; 44 return strcmp(a.s1,b.s1)<0; 45 } 46 int main() 47 { 48 int n,kk=0,i,j; 49 while(cin>>n) 50 { 51 if(!n) break; 52 memset(w,0,sizeof(w)); 53 for(i = 0 ; i <= 200 ; i++) 54 ed[i].clear(); 55 kk++; 56 f.clear(); 57 g = 0; 58 int oo=0; 59 for(i = 1; i <= n ;i++) 60 { 61 cin>>s1>>s2; 62 if(!f[s1]) 63 { 64 f[s1] = ++g; 65 strcpy(s[g],s1); 66 } 67 if(!f[s2]) {f[s2] = ++g;strcpy(s[g],s2);} 68 w[f[s1]][f[s2]] = 1; 69 ed[f[s1]].push_back(f[s2]); 70 } 71 int o = 0; 72 for(i = 1; i <= g ; i++) 73 { 74 for(j = 0 ; j< (int)ed[i].size() ; j++) 75 { 76 int v = ed[i][j]; 77 w[i][v] = 0; 78 memset(vis,0,sizeof(vis)); 79 if(dfs(i,v)) 80 { 81 o++; 82 strcpy(p[o].s1,s[i]); 83 strcpy(p[o].s2,s[v]); 84 } 85 else 86 w[i][v] = 1; 87 } 88 } 89 sort(p+1,p+o+1,cmp); 90 printf("Case %d: ",kk); 91 if(o!=0) 92 { 93 oo++; 94 pp[oo] = p[1]; 95 } 96 for(i = 2 ; i <= o ; i++) 97 { 98 if(strcmp(p[i].s1,p[i-1].s1)==0&&strcmp(p[i].s2,p[i-1].s2)==0) 99 continue; 100 oo++; 101 pp[oo] = p[i]; 102 } 103 printf("%d",oo); 104 for(i = 1 ; i < oo ; i++) 105 printf(" %s,%s",pp[i].s1,pp[i].s2); 106 if(oo!=0) 107 printf(" %s,%s",pp[oo].s1,pp[oo].s2); 108 puts(""); 109 } 110 return 0; 111 } 112 113 114 115 116 /************************************** 117 Problem id : SDUT OJ 2723 118 User name : shang 119 Result : Accepted 120 Take Memory : 17068K 121 Take Time : 520MS 122 Submit Time : 2013-12-01 14:12:31 123 **************************************/