【深搜】迷宮

聲明


個人碼風可能有點和別人不太同樣(其實就是有點奇怪),你們重在乎會便可~。ios

原題傳送門函數

題目


【問題描述】
給定一個N*M方格的迷宮,迷宮裏有T處障礙,障礙處不可經過。給定起點座標和
終點座標,問: 每一個方格最多通過1次,有多少種從起點座標到終點座標的方案。在迷宮
中移動有上下左右四種方式,每次只能移動一個方格。數據保證起點上沒有障礙。
輸入樣例 輸出樣例
【數據規模】
1≤N,M≤5spa

輸入輸出格式

輸入格式:

【輸入】
第一行N、M和T,N爲行,M爲列,T爲障礙總數。第二行起點座標SX,SY,終點
座標FX,FY。接下來T行,每行爲障礙點的座標。code

輸出格式:

【輸出】
給定起點座標和終點座標,問每一個方格最多通過1次,從起點座標到終點座標的方
案總數。ci

前言

~~這道題話說是真的水,不過用來練習深搜仍是很好的。 ~~這道題十分經典,強烈建議你們本身敲一遍,感覺一下這道極其基礎的深搜題.get

代碼詳解


爲避免繁瑣的if語句,先來打個表io

const int nextx[4]={0,0,1,-1};
const int nexty[4]={-1,1,0,0};

深搜函數:class

void dfs(int x,int y)//深搜 
判斷邊界:
if(x<1||y<1||x>n||y>m)//若是越界,則返回 
  return;

判斷是否到達終點:stream

if(x==fx&&y==fy)//若是到達終點,則方案數加一 
{
    ans++;
    return;
}

搜索與回溯(重點):基礎

b[x][y]=true;//將當前點標記爲已訪問 
for(int i=0;i<=3;i++)        
    if(b[x+nextx[i]][y+nexty[i]]==false&&a[x+nextx[i]][y+nexty[i]]==true)//若是未訪問且不是障礙物    
        dfs(x+nextx[i],y+nexty[i]);    //則繼續深搜 
b[x][y]=false;//回溯

深搜的完整函數:

void dfs(int x,int y)//深搜 
{
    if(x<1||y<1||x>n||y>m)//若是越界,則返回 
        return;
    if(x==fx&&y==fy)//若是到達終點,則方案數加一 
    {
        ans++;
        return;
    }
    b[x][y]=true;//將當前點標記爲已訪問 
    for(int i=0;i<=3;i++)        
        if(b[x+nextx[i]][y+nexty[i]]==false&&a[x+nextx[i]][y+nexty[i]]==true)//若是未訪問且不是障礙物    
            dfs(x+nextx[i],y+nexty[i]);    //則繼續深搜 
    b[x][y]=false;//回溯 
}

完整AC代碼


大家最愛的AC代碼~~~

#include <iostream>
using namespace std;
bool a[10][10];
bool b[10][10]={0};
int n,m,t,sx,sy,fx,fy,ans=0;
const int nextx[4]={0,0,1,-1};
const int nexty[4]={-1,1,0,0};
  
void dfs(int x,int y)//深搜 
{
     if(x<1||y<1||x>n||y>m)//若是越界,則返回 
         return;
     if(x==fx&&y==fy)//若是到達終點,則方案數加一 
     {
         ans++;
         return;
     }
     b[x][y]=true;//將當前點標記爲已訪問 
     for(int i=0;i<=3;i++)        
         if(b[x+nextx[i]][y+nexty[i]]==false&&a[x+nextx[i]][y+nexty[i]]==true)//若是未訪問且不是障礙物    
             dfs(x+nextx[i],y+nexty[i]);    //則繼續深搜 
     b[x][y]=false;//回溯 
}
int main()
{
     int tx,ty;
     cin>>n>>m>>t>>sx>>sy>>fx>>fy;
     for(int i=1;i<=n;i++)
         for(int j=1;j<=m;j++)
             a[i][j]=true;
     for(int i=1;i<=t;i++)
     {
         cin>>tx>>ty;
         a[tx][ty]=false;
     }
     b[sx][sy]=true;
     dfs(sx,sy);
     cout<<ans;//輸出結果 
     return 0;
}

後記


這道題因爲我手殘,敲完代碼時不當心關了...關了...因而重打一了遍,浪費了很多時間,不過這些都不重要~ ~ ~各位大佬們看到這裏,可否給個贊呢?~>_< ~

相關文章
相關標籤/搜索