1. 程式人生 > >[hhuoj]“朝陽·聚位元”河海大學程式設計競賽(低年級組)C.滑冰

[hhuoj]“朝陽·聚位元”河海大學程式設計競賽(低年級組)C.滑冰

一年前的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的時候,把判斷是否合法儘量寫在函式終止條件(函式頭部),而不要在迴圈內,否則就可能產生這種問題。