I'm stuck! ccf模拟题。
ccf模擬題。
?
I’m stuck!
| 時間限制: | 1.0s |
| 內(nèi)存限制: | 256.0MB |
?
問題描述
給定一個R行C列的地圖,地圖的每一個方格可能是'#',?'+',?'-',?'|',?'.',?'S',?'T'七個字符中的一個,分別表示如下意思:
?
'#': 任何時候玩家都不能移動到此方格;
'+': 當(dāng)玩家到達(dá)這一方格后,下一步可以向上下左右四個方向相鄰的任意一個非'#'方格移動一格;
'-': 當(dāng)玩家到達(dá)這一方格后,下一步可以向左右兩個方向相鄰的一個非'#'方格移動一格;
'|': 當(dāng)玩家到達(dá)這一方格后,下一步可以向上下兩個方向相鄰的一個非'#'方格移動一格;
'.': 當(dāng)玩家到達(dá)這一方格后,下一步只能向下移動一格。如果下面相鄰的方格為'#',則玩家不能再移動;
'S': 玩家的初始位置,地圖中只會有一個初始位置。玩家到達(dá)這一方格后,下一步可以向上下左右四個方向相鄰的任意一個非'#'方格移動一格;
'T': 玩家的目標(biāo)位置,地圖中只會有一個目標(biāo)位置。玩家到達(dá)這一方格后,可以選擇完成任務(wù),也可以選擇不完成任務(wù)繼續(xù)移動。如果繼續(xù)移動下一步可以向上下左右四個方向相鄰的任意一個非'#'方格移動一格。
此外,玩家不能移動出地圖。
請找出滿足下面兩個性質(zhì)的方格個數(shù):
1. 玩家可以從初始位置移動到此方格;
2. 玩家不可以從此方格移動到目標(biāo)位置。
輸入格式
輸入的第一行包括兩個整數(shù)R 和C,分別表示地圖的行和列數(shù)。(1 ≤ R, C ≤ 50)。
接下來的R行每行都包含C個字符。它們表示地圖的格子。地圖上恰好有一個'S'和一個'T'。
輸出格式
如果玩家在初始位置就已經(jīng)不能到達(dá)終點了,就輸出“I'm stuck!”(不含雙引號)。否則的話,輸出滿足性質(zhì)的方格的個數(shù)。
樣例輸入
5 5
--+-+
..|#.
..|##
S-+-T
####.
樣例輸出
2
樣例說明
如果把滿足性質(zhì)的方格在地圖上用'X'標(biāo)記出來的話,地圖如下所示:
--+-+
..|#X
..|##
S-+-T
#include<bits/stdc++.h>
int xx[5]={1,-1,0,0};
int yy[5]={0,0,1,-1};
int vis[51][51];
int can[51][51];
char a[51][51];
int r,c;
int flag;
int counter;
void bfs(int x,int y)
{int dx,dy,rear,front;rear=front=0;while(front<=rear){ if(a[x][y]=='+'||a[x][y]=='S'||a[x][y]=='T'){for(int i=0;i<4;i++){dx=x+xx[i];dy=y+yy[i];if(dx>=0&&dx<r&&dy>=0&&dy<c&&a[dx][dy]!='#'&&vis[dx][dy]!=1){vis[dx][dy]=1;if(flag==0&&a[dx][dy]=='T')counter++;if(flag)can[dx][dy]=1;bfs(dx,dy);rear++;}}}else if(a[x][y]=='-'){for(int i=2;i<4;i++){dx=x+xx[i];dy=y+yy[i];if(dx>=0&&dx<r&&dy>=0&&dy<c&&a[dx][dy]!='#'&&vis[dx][dy]!=1){ if(flag)can[dx][dy]=1;if(flag==0&&a[dx][dy]=='T')counter++;vis[dx][dy]=1;bfs(dx,dy);rear++;}}}else if(a[x][y]=='|'){for(int i=0;i<2;i++){dx=x+xx[i];dy=y+yy[i];if(dx>=0&&dx<r&&dy>=0&&dy<c&&a[dx][dy]!='#'&&vis[dx][dy]!=1){ vis[dx][dy]=1;if(flag)can[dx][dy]=1;if(flag==0&&a[dx][dy]=='T')counter++;bfs(dx,dy);rear++;}}}else if(a[x][y]=='.'){dx=x+xx[0];dy=y+yy[0];if(dx>=0&&dx<r&&dy>=0&&dy<c&&a[dx][dy]!='#'&&vis[dx][dy]!=1){ if(flag)can[dx][dy]=1;if(flag==0&&a[dx][dy]=='T')counter++;vis[dx][dy]=1;bfs(dx,dy);rear++; } }front++;}
return;
}
int main()
{int x_e,x_s,k1=51,k2=51;scanf("%d %d",&r,&c);memset(vis,0,sizeof(vis));memset(can,0,sizeof(can));for(int i=0;i<r;i++){scanf("%s",&a[i]);}flag=1;for(int i=0;i<r;i++){for(int j=0;j<c;j++){ if(a[i][j]=='S'){vis[i][j]=1;bfs(i,j);}}}flag=0;int ans=0;bfs(0,2);
for(int i=0;i<r;i++)
{for(int j=0;j<c;j++){if(can[i][j]==1&&a[i][j]!='T'&&a[i][j]!='S'){ memset(vis,0,sizeof(vis));ans++;bfs(i,j);}if(a[i][j]=='T'){k1=i;k2=j;}}
}if(can[k1][k2]==1)printf("%d",ans-counter);elseprintf("I'm stuck!");
}
?
?
####X
一開始少了一個vis[dx][dy]=1;30分后來改過來了90分然后才發(fā)現(xiàn)我沒判斷I’m stuck!的條件所幸很簡單我又加上了。我覺得我的代碼比網(wǎng)上大多數(shù)都好理解吧。雖然有點長。
?
說一下思路吧,一開始時判斷能從S到達(dá)的點,并把這些點做標(biāo)記。就是can數(shù)組。后來在從被標(biāo)記的點出發(fā),看他能不能到T點,能的話counter加一。最后再用標(biāo)記的點個數(shù)的總數(shù)減去那些能到T的點。i'm stuck的條件也很好判斷,當(dāng)我再給那些點做標(biāo)記的時候如果T點沒標(biāo)記的話證明從s出發(fā)不能到T;
總結(jié)
以上是生活随笔為你收集整理的I'm stuck! ccf模拟题。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这瓶伏特加多少钱,朋友送的,急着回礼,急
- 下一篇: map函数的简单用法。