[hhuoj]“朝陽·聚位元”河海大學程式設計競賽(低年級組)C.滑冰
阿新 • • 發佈:2019-02-05
一年前的2017.12.02,頭次參加了程式設計類的比賽,學校的ACM校賽,在低年級組全是水題的情況下只做上兩道題(其中一個還是hello world),其中有一道題只有1AC(by LuckyT99),由於AC數量過少,賽完很長一段時間對這道題有一種恐懼的心態,導致不敢去補題(還不是隻挑軟柿子捏,哪個簡單做哪個?)
一年後的今天(11.18),低年級組摸底熱身賽這道題再次出現,學弟問我這道題怎麼做,才終於正視這道題,以一年後的水平,居然做了兩個小時(+3)才AC,自己真的菜得要命啊!
傳送門:
思路:
簡單的搜尋,根據題意模擬動作即可。
程式碼:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
static const int maxn = 100010;
static const double eps = 1e-6;
static const int INF = 0x3f3f3f3f;
static const double pi = acos(-1);
static const int mod = (int)1e9 + 7;
void redirect(){
#ifdef LOCAL
freopen("test.txt" ,"r",stdin);
#endif
}
char maze[15][15];
const int dx[] = {0,1,0,-1};
const int dy[] = {1,0,-1,0};
int sx,sy,n,m,d;
bool flag = true;
bool vis[15][15][4];
void dfs(int x,int y,int dir){
if(x <= 0 || y <= 0 || x >= n+1 || y >= m+1 || maze[x][y] == 'X')return;
if(flag == false || vis[ x][y][dir] == true)return;
vis[x][y][dir] = true;
if(maze[x][y] == 'U'){flag = false;return;}
int tx = x+dx[dir],ty = y+dy[dir];
if(maze[tx][ty] == 'X')
for(int i = 1;i <= 3;i++)d = (dir+i)%4,dfs(x+dx[d],y+dy[d],d);
else dfs(tx,ty,dir);
}
int main(){
redirect();
scanf("%d %d",&n,&m);
for(int i = 1;i <= n;i++){
scanf("%s",maze[i]+1);
for(int j = 1;j <= m;j++)
if(maze[i][j] == 'K')sx = i,sy = j;
}
for(int i = 0;i < 4;i++)
dfs(sx,sy,i);
if(flag)puts("Safe");
else puts("Dangerous");
return 0;
}
坑點:
在類似XKX的情況中,WA的寫法是遇到X就dfs其他三個方向,而忘記判斷是否合法,導致X被當作O走了,在
4 3
OUO
OXO
XKX
OXO
這組資料中,U被視為可達,導致WA。
總結:
在寫dfs的時候,把判斷是否合法儘量寫在函式終止條件(函式頭部),而不要在迴圈內,否則就可能產生這種問題。