主要题意是:大海之间有岛,有的岛之间有桥,问你岛的个数,桥的个数,以及没有桥联通岛的个数,其中最后一次输入的没有回车,不注意的话最后一次会被吞,第二,桥的两端的标记是“X”(X也代表陆地),“X”的四周都可以有“B”形成的桥,一开始没写好,后来根据“X”标记所有的桥只能走一次然后标记……总之,虽然是水题,写出来还是蛮开心的……
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <map> #include <cmath> #include <cstring> #include <string> #include <queue> #include <stack> #include <cctype> const double Pi = atan(1) * 4; using namespace std; char str[100][100]; bool visit1[100][100]; bool visit2[100][100]; int cnt ; int len; int bridge; int dr[] = {1,-1,0,0}; int dc[] = {0,0,-1,1}; void dfs1(int r,int c){ visit1[r][c] = 1; for(int i = 0;i < 4;i++){ int xx = r + dr[i]; int yy = c + dc[i]; if(xx >= 0 && yy >= 0 && xx < cnt && yy < len){ if(!visit1[xx][yy] && (str[xx][yy] == '#' || str[xx][yy] == 'X' )){ dfs1(xx,yy); } } } } void dfs2(int r,int c){ visit2[r][c] = 1; for(int i = 0;i < 4;i++){ int xx = r + dr[i]; int yy = c + dc[i]; if(xx >= 0 && yy >= 0 && xx < cnt && yy < len){ if(!visit2[xx][yy] && (str[xx][yy] == '#' || str[xx][yy] == 'X')){ dfs2(xx,yy); } else if(str[xx][yy] == 'B' && str[r][c] == 'X' && !visit2[xx][yy]){ int j = 0; visit2[xx][yy] = 1; bridge++; while(1){ j++; int tt1 = xx + j * dr[i]; int tt2 = yy + j * dc[i]; if(tt1 < 0 || tt2 < 0 || tt1 >= cnt || tt2 >= len) break; visit2[tt1][tt2] = 1; if(str[tt1][tt2] == 'X'){ dfs2(tt1,tt2); break; } } } } } } int main() { //freopen("input.in","r",stdin); //freopen("output.in","w",stdout); cnt = 0; int cas = 1; memset(str,0,sizeof(str)); while(fgets(str[0],sizeof(str[0]),stdin) != NULL){ if(cas != 1) cout << endl; len = strlen(str[0]) - 1; while((fgets(str[++cnt],sizeof(str[0]),stdin) )!= NULL){ if(str[cnt][0] == 10){ break; } } bridge = 0; int bus = 0; int island = 0; memset(visit1,0,sizeof(visit1)); memset(visit2,0,sizeof(visit2)); for(int i = 0;i <= cnt;i++){ for(int j = 0;j < len;j++){ if( (str[i][j] == '#' || str[i][j] == 'X') && !visit1[i][j]){ island++; dfs1(i,j); } if( (str[i][j] == '#' || str[i][j] == 'X')&& !visit2[i][j]){ bus++; dfs2(i,j); } } } cout << "Map " << cas++ << endl; cout << "islands: " << island << endl; cout << "bridges: " << bridge << endl; cout << "buses needed: " << bus << endl; cnt = 0; memset(str,0,sizeof(str)); } return 0; }