奮戰杭電ACM(DAY6)1010

糾結了兩天的題,一開始本身想不出來,上網搜前輩的解題報告,沒看懂……快哭了ios

對算法掌握太少了,知道知識點是深度優先遍歷(DFS)和剪枝(本題特殊在奇偶剪枝),因而花了一天的時間學習這兩個知識點,處處翻書哇!!因而仍是沒作出來……可是又結合前輩的解題報告,此次能看懂了!!微笑算法

而後本身作,失敗2次……第三次解決了!!提交,一次AC!!微笑學習

做對這道題成就感賽過昨天AC4到啊!!微笑優化

總結一下,本題的思路仍是很明確的,DFS出全部走法,再根據條件剪枝,優化,減小時間空間損耗。spa

Tempter of the Bone

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int N,M,T,end_i,end_j;
bool visited[6][6],res;//由於1<N,M<7,因此開到6就能夠
char maze[6][6];

void DFS(int i, int j, int t)
{
    if(res) return;//吭哧吭哧剪枝ing……
    if(t>T) return;
    if(i<0 || i>=N || j<0 || j>=M) return;
    int temp;
    temp= abs(i-end_i)+abs(j-end_j);
    if((T-t-temp) & 1) return;//奇偶剪枝
    if(t==T && maze[i][j]=='D')
        {res=true; return;}
    
    if(!visited[i-1][j] && maze[i-1][j]!='X')//DFS出全部走法……四個方向~~
    {
        visited[i-1][j]=true;//以下
        DFS(i-1, j, t+1);
        visited[i-1][j]=false;//這兩步很巧妙!!
    }
    if(!visited[i+1][j] && maze[i+1][j]!='X')
    {
        visited[i+1][j]=true;
        DFS(i+1, j, t+1);
        visited[i+1][j]=false;
    }
    if(!visited[i][j-1] && maze[i][j-1]!='X')
    {
        visited[i][j-1]=true;
        DFS(i, j-1, t+1);
        visited[i][j-1]=false;
    }
    if(!visited[i][j+1] && maze[i][j+1]!='X')
    {
        visited[i][j+1]=true;
        DFS(i, j+1, t+1);
        visited[i][j+1]=false;
    }
}

int main()
{
    while(cin >> N >> M >> T && (N || M || T))//此次還學到了bool型的用法,節省了很多!!
    {
        int i,j,k=0,s_i,s_j,min;
        memset(visited, false, sizeof(visited));//這個也很新穎,一次性所有賦值,頭文件<string>
        for(i=0; i<N; i++)
        {
            for(j=0; j<M; j++)
            {
                cin >> maze[i][j];
                if(maze[i][j]=='S')
                    {s_i=i; s_j=j; visited[i][j]=true;}
                if(maze[i][j]=='D')
                    {end_i=i; end_j=j;}
                if(maze[i][j]=='X')
                    k+=1;
            }
        }
        res=false;
        min=abs(s_i-end_i) + abs(s_j-end_j);
        if(abs(min-T)%2==0 && min<=T && (N*M-k-1>=T))//各類剪枝~~~^O^
            DFS(s_i,s_j,0);
        if(res)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}
相關文章
相關標籤/搜索