uestc 1855, dfs, 模拟
C.S.I.: P15
Time Limit: 1000 ms Memory Limit: 65535 kB Solved: 23 Tried: 249
Description
You have been cast as the computer genius hero-of-the-day for the season finale of the show C.S.I.: P15 (coming this fall). Somewhat unsurprisingly,there is that camera feed that needs to be analyzed. The camera in question is recording pictures in HD-9000 quality with extra regression and the stream is then internally matched by a re-inverted isomorphic bit coefficient matrix, then plasma shifted five times for good measure. You then view the feed through Netscape Navigator 4 Platinum Edition. (Note that "internally" is just fancy talk for "inside the camera".)
Unfortunately, a saboteur turned on ASCII mode on the
camera and set the camera in picture burst mode. So now all you have is a
bunch of still ASCII images. And now,for reasons that will be revealed
later in the show, you are to design and implement a deterministic
algorithm for counting the number of flowers and birds in a given still
image.
The pictures always include the ground,which will show up as a
contiguous row of '=' characters. The ground will always be the
bottom-most row of "ASCII pixels". There will never be anything else on
that row (though, on one of the pictures taken before the sabotage there
is a stray electron that a someone will accidentally nd by zooming in
too far, but that is for a later episode).
Air is marked in the feed
as a '.' (a dot). The ground is the last line of the feed, and it looks
like this: '==========='. A flower is defined as any 8-connected
component which consists of characters from the set { '|', '/', '\',
'-', '@'}, and which is also connected to the ground. Two cells belong
to the same 8-connected component if there is a path between them that
goes through elements from the forementioned set only, such that each
step in the path is to an 8-connected neighbour (horizontally,
vertically, or diagonally adjacent cell). A bird is an occurence of
'/\/\', such that all neighbouring cells are either air or edges of the
image. So if you see something that looks like a bird on the ground, it
is a flower (possibly an ex-parrot, but that is also a flower for our
purposes).
Input
The first line of the input
consists of a single integer T, the number of test cases. Each of the
following T cases then begins with a line of two integers separated by a
space,the height H and width W, and ends with H lines describing the
picture. Each line of the picture has exactly W characters. All lines
but the last consist of only the following characters: { '.', '|', '/',
'\', '-', '@'}. The last line consists of '=' characters only.
0 < T <= 100
0 < W <= 30
0 < H <= 30
Output
For each test case, output two
lines. If the number of flowers is F and the number of birds is B, the
output should read
Flowers: F
Birds: B
Sample Input
1
12 28
............................
............................
\@/.../\/\..../\/\..........
.|..........................
.|....\@/.........../\/\....
.|.....|.............|......
.|.....|.............|......
.|.....|..\@/....\@/.|......
.|.....|....\..../...|.|-|..
.|.....|.....\../....|.|.|..
.|.....|......\/.....|.|.|..
============================
Sample Output
Flowers: 5
Birds: 2
Source
IDI Open 2013 Programming Contest
模拟+深搜
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<vector> #include<cstdlib> #include<algorithm> using namespace std; #define LL long long #define ULL unsigned long long #define UINT unsigned int #define MAX_INT 0x7fffffff #define MAX_LL 0x7fffffffffffffff #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) #define MAXN 33 char g[MAXN][MAXN]; //const char ok[]={'|', '/', '\\', '-', '@'}; const int dx[]={-1, -1, -1, 0, 0, 1, 1, 1}, dy[]={0, -1, 1, -1, 1, -1, 0, 1}; int w, h, birds, flo; bool vis[MAXN][MAXN]; bool cango(int x, int y){ if(x<0 || y<0 || x>h-2 || y>w-1 || g[x][y]=='.' || vis[x][y]) return false; return true; } void dfs(int x, int y){ vis[x][y]=true; for(int i=0; i<8; i++){ int tx=x+dx[i], ty=y+dy[i]; if(cango(tx, ty)) dfs(tx, ty); } } bool ok_lft(int x, int y){ return y<0 || g[x][y]=='.'; } bool ok_rit(int x, int y){ return y>=w || g[x][y]=='.'; } bool ok_up(int x, int y){ if(x<0) return true; for(int k=0; k<6 && y<w && y>-1; k++, y--) if(g[x][y]!='.') return false; return true; } bool ok_down(int x, int y){ for(int k=0; k<6 && y<w && y>-1; k++, y--) if(g[x][y]!='.') return false; return true; } bool isbird(int x, int y){ if(ok_lft(x, y-4) && ok_rit(x, y+1) && ok_up(x-1, y+1) && ok_down(x+1, y+1)) return true; return false; } int main(){ // freopen("C:\\Users\\Administrator\\Desktop\\in.txt","r",stdin); int T; scanf(" %d", &T); while(T--){ int i, j; scanf(" %d %d", &h, &w); getchar(); for(i=0; i<h; i++) gets(g[i]); // for(i=0; i<h; i++) printf("%s\n",g[i]); memset(vis, 0, sizeof(vis)); birds=flo=0; if(h==1){ printf("Flowers: %d\nBirds: %d\n", flo, birds); continue; } for(i=0; i<w; i++) if(cango(h-2, i)){ dfs(h-2, i); flo++; // cout<<cnt<<' '<<i<<endl; } string bid; bid+='/'; bid+='\\'; bid+='/'; bid+='\\'; for(i=0; i<h-2; i++) for(j=0; j<w; j++) if(g[i][j]=='/' && w-j>=4 && !vis[i][j]){ string t; for(int q=0; q<4 && !vis[i][j]; q++, j++) t+=g[i][j]; if(t==bid && isbird(i, j-1)) birds++; } printf("Flowers: %d\nBirds: %d\n", flo, birds); } return 0; }