1. 程式人生 > >杭電1312題搜尋演算法

杭電1312題搜尋演算法

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
/* .可以走,#是牆不能走,@表示起點,搜尋演算法 */
struct node   //點的結構體
{
    int x;   //x軸的座標
    int y;  //y軸的座標
};
queue<node>q;   //廣搜需要用到的佇列
char maze[105][105];  //存入資料的陣列
bool vis[105][105];//記錄軌跡
bool xin[105][105];//記錄是否收錄此結點
int n,m,total;
int dx[4]={1,-1,0,0};  //四個方向
int dy[4]={0,0,1,-1};  //四個方向
void bfs(node t)  //廣度優先搜尋
{
   node g,h;
   q.push(t);
   while(!q.empty())   //當佇列為空時,即無路可走
   {
       g=q.front();
       vis[g.x][g.y]=true;   //標記當前節點已經走過
       if(!xin[g.x][g.y])
       {
          total++;
          xin[g.x][g.y]=true;
       }
       for(int i=0;i<4;i++)
       {
           h.x=g.x+dx[i];   h.y=g.y+dy[i];
           if(h.x>=0&&h.x<m&&h.y>=0&&h.y<n&&!vis[h.x][h.y]&&maze[h.x][h.y]=='.')
            q.push(h);
       }
       q.pop();
   }
}
void dfs(node t)  //深度優先搜尋
{
    node h;
    if(!xin[t.x][t.y])
    {
        total++;
        xin[t.x][t.y]=true;
    }
    for(int i=0;i<4;i++)
    {
       h.x=t.x+dx[i];  h.y=t.y+dy[i];
       if(h.x>=0&&h.x<m&&h.y>=0&&h.y<n&&!vis[h.x][h.y]&&maze[h.x][h.y]=='.')
       {
           vis[h.x][h.y]=true;
           dfs(h);//不需要回溯
       }
    }
}
int main()
{
    int x1,y1;
    node h;
    while(cin>>n>>m)//m為行,n為列
    {
        if(n==0&&m==0)  break;
        total=0;
        memset(vis,false,sizeof(vis));
        memset(xin,false,sizeof(xin));
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
             {
                cin>>maze[i][j];
                if(maze[i][j]=='@')
                {
                    h.x=i;  h.y=j;  //記錄起點
                }
             }
        dfs(h);
        while(!q.empty())  q.pop();  //用完廣度優先搜尋,一定要清空佇列
        cout<<total<<endl;
    }
    return 0;
}

相關推薦

1312搜尋演算法

#include <iostream> #include <cstring> #include <queue> using namespace std; /* .可以走,#是牆不能走,@表示起點,搜尋演算法 */ struc

100】RPG專場練習賽 2063 過山車(匈牙利演算法

Problem Description 過山車的每一排只有兩個座位,每個女生必須找個男生做partner和她同坐,每個女生都願意跟若干男生做partner。只讓找到partner的人去坐過山車,最多有多少對組合可以坐上過山車? Input 輸入資料的第一行是三個整數K

100】【DP】2059 龜兔賽跑

Problem Description 兔子能夠毫不休息得以恆定的速度(VR m/s)一直跑。 烏龜不惜花下血本買了最先進的武器——“"小飛鴿"牌電動車。這輛車在有電的情況下能夠以VT1 m/s的速度“飛馳”,可惜電池容量有限,每次充滿電最多隻能行駛C米的距離,以後就只能用腳來蹬了,烏龜用腳

100】【貪心】2037 今年暑假不AC(活動安排問題)

今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 77466 &nbs

100】2070 Fibbonacci Number

Problem Description Your objective for this question is to develop a program which will generate a fibbonacci number. The fibbonacci function is def

100】【DP_動態規劃】2084 數塔

Problem Description 在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的: 有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少? 已經告訴你了,這是個DP的題目,你能AC嗎? Input 輸入資料首先包括一

oj--1070(貪心演算法)

  1. Ignatius will never drink the milk which is produced 6 days ago or earlier. That means if the milk is produced 2005-1-1, Igna

2015 偶數求和

Problem Description 有一個長度為n(n<=100)的數列,該數列定義為從2開始的遞增有序偶數,現在要求你按照順序每m個數求出一個平均值,如果最後不足m個,則以實際數量求平均值。程式設計輸出該平均值序列。 Input 輸入資料有多組,每組佔一行,包含兩個正整數n和m,

ACM1005

這就是一種迴圈,列出來你便會發現每48個數是一個迴圈。 #include<stdio.h> int main() { int A,B,i; long int n; while(scanf("%d%d%ld",&

ACM1012

這題比較簡單,就不詳細講了,大概就是分幾類當等於0,1,2,n時分別計算就可以了。 #include<stdio.h> #include<math.h> int main() { double sum=2.5; int

ACM2010

#include<stdio.h> int main() { int m,n; int a,b,c; int x; while(scanf("%d %d",&m,&n)!=EOF) { x=0; for(;m<

步驟

歡迎關注大佬部落格:點選開啟連結C和指標課後練習題總結:點選開啟連結今天無意之間看到了一篇部落格,大佬真的是太6了,終於有一個刷題步驟了,以前都是胡亂刷。跪謝大佬 第一階段:入門一.輸入輸出練習(2天,10題)         1000、1089—1096、1001二.簡單操

ACM2005(第幾天?)------C語言

第幾天? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 127309    Accepted Submissi

oj1052:Tian Ji -- The Horse Racing

題目:Here is a famous story in Chinese history."That was about 2300 years ago. General Tian Ji was a high official in the country Qi. He li

ACM2003

Problem Description 求實數的絕對值。 Input 輸入資料有多組,每組佔一行,每行包含一個實數。 Output 對於每組輸入資料,輸出它的絕對值,要求每組資料輸出一行,

ACM2001-------C語言

計算兩點間的距離 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 181355    Accepted Subm

oj庫分類

附:2000-2099全是水題。 1001 這個就不用說了吧 1002 簡單的大數 1003 DP經典問題,最大連續子段和 1004 簡單題 1005 找規律(迴圈點) 1006 感覺有點BT的題,我到現在還沒過 1007 經典問題,最近點對問題,用分治 1008 簡單題 1009 貪心 1010 搜尋題,

100】C語言程式設計練習(三)2014 青年歌手大獎賽_評委會打分

http://acm.hdu.edu.cn/showproblem.php?pid=2014Problem Description青年歌手大獎賽中,評委會給參賽選手打分。選手得分規則為去掉一個最高分和一個最低分,然後計算平均得分,請程式設計輸出某選手的得分。Input輸入資料

ACM2004(成績轉換)-----C語言

成績轉換 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 124199    Accepted Submissi

ACM1002

#include <iostream> using namespace std; const int N = 1000; int main() { char a[N], b[N]; int sum[N] = {0}; int t, m