1.最大连通块(来源:http://oj.ipoweru.cn/problem/10705)
//40分代码(只有一行的)
#include<bits/stdc++.h> using namespace std; int maxn[25];//当前最长和最终最长 int n,nn,mm; char aa[1005]; int main() { memset(maxn,0,sizeof(maxn)); scanf("%d",&n); for(int i=1;i<=n;i++)maxn[i]=1; int i=1; while(i<=n) { int now=1; //最开始忘了清除! (这就是我调了一小时没有调出来的原因!!!TAT) cin>>nn>>mm; for(int j=1;j<=mm;j++) { cin>>aa[j]; if(j>=2) { //不区分1和2以后的结果就会多一个 if(aa[j]!='0'&&aa[j-1]!='0') { now++; maxn[i]=max(maxn[i],now); //一定要知道这个maxn放在哪里 } else if(aa[j]=='0')now=1; } } i++; }//这是循环结束的那个后括号=.= for(int i=1;i<=n;i++)cout<<maxn[i]<<endl; return 0; }
//100分代码
#include <iostream> #include <cstring> using namespace std; int t, n, m, ans, sum; char map[6][1005][1005]; bool searched[1005][1005]; int dx[4] = { 1, -1, 0, 0 }, dy[4] = { 0, 0, 1, -1 }, tx, ty; void search(int z, int x, int y) { if (ans < sum) ans = sum; for (int i = 0; i <= 3; i++) { tx = x + dx[i]; ty = y + dy[i]; if (map[z][tx][ty] == '1' && tx >= 1 && tx <= n && ty >= 0 && ty < m && searched[tx][ty] == 0) { searched[tx][ty] = 1; sum++; search(z, tx, ty); } } } int main() { cin >> t; for (int i = 1; i <= t; i++) { cin >> n >> m; for (int j = 1; j <= n; j++) cin >> map[i][j]; } for (int i = 1; i <= 5; i++) { for (int j = 1; j <= n; j++) for (int k = 0; k < m; k++) if (map[i][j][k] == '1' && searched[j][k] == 0) { sum++; searched[j][k] = 1; search(i, j, k); sum = 0; } cout << ans << endl; sum = 0; ans = 0; memset(searched, 0, sizeof(searched)); } return 0; }