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

一年前的2017.12.02,頭次參加了程序設計類的比賽,學校的ACM校賽,在低年級組全是水題的情況下只做上兩道題(其中一個還是hello world),其中有一道題只有1AC(by LuckyT99),由於AC數量過少,賽完很長一段時間對這道題有一種恐懼的心態,導致不敢去補題(還不是隻挑軟柿子捏,哪個簡單做哪個?)
一年後的今天(11.18),低年級組摸底熱身賽這道題再次出現,學弟問我這道題怎麼做,才終於正視這道題,以一年後的水平,居然做了兩個小時(+3)才AC,自己真的菜得要命啊!

傳送門:

http://acm.hhu.edu.cn/problem.php?cid=1015&pid=2

思路:

簡單的搜索,根據題意模擬動作即可。

代碼:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章