NYOJ迷宮尋寶(一)

2021-07-15 21:01:01 字數 3530 閱讀 4515

描述

乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門(n<=5),它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這個門所需的所有鑰匙(每個門都至少有一把鑰匙),例如:現在a門有三把鑰匙,acm就必須找全三把鑰匙才能開啟a門。現在請你編寫乙個程式來告訴acm,他能不能順利的得到寶藏。

輸入

輸入可能會有多組測試資料(不超過10組)。

每組測試資料的第一行包含了兩個整數m,n(1

輸出每行輸出乙個yes表示acm能找到寶藏,輸出no表示acm找不到寶藏。

深搜法

#include

#include

void fun(int,int);

char arr[25][25];

int arr1[25][25],flag,m,n;

int a,b,c,d,e,a1,b1,c1,d1,e1;

int main()

}getchar();   //消除回車

}fun(m1,n1);    

if(flag==1)

printf("yes\n");

else

printf("no\n");

} return 0;

}void fun(int x,int y)

int tx,ty;

//定義四個方向座標  下      左      上      右

int next[4][2]=,,,};    

for(int i=0;i<4;i++)

else if(arr[tx][ty]=='b'&&b 

else if(arr[tx][ty]=='c'&&c

else if(arr[tx][ty]=='d'&&d  

else if(arr[tx][ty]=='e'&&e

// 遇到鑰匙把鑰匙拿走,並且把鑰匙變為路

else if(arr[tx][ty]=='a')

else if(arr[tx][ty]=='b')

else if(arr[tx][ty]=='c')

else if(arr[tx][ty]=='d')

else if(arr[tx][ty]=='e')

//走過的座標進行標記

arr1[tx][ty]=1;

//進行下一次嘗試

fun(tx,ty);

//若flag=1,說明已經找到寶藏,則直接返回,不用進行其他嘗試

即剪枝操作,提高效率

if(flag==1)

return;

//取消標記

arr1[tx][ty]=0;

}}

廣搜法

#include

#include

char arr[30][30];

int arr1[30][30],a,a1,b,b1,c,c1,d,d1,e,e1;

int m,n,flag;

int judge();

void dfs(int,int);

struct node

s[500];

int main()

}getchar();

}dfs(m1,n1);

while(judge()==0&&flag==0)//所有可以去的地方遍歷一遍後判斷是否有可以開啟的門

dfs(s[0].x,s[0].y);

}if(flag==1)

if(flag==0)

}return 0;

}//  判斷是否有能到達且能開啟的門

int judge()}}

}if(b>=b1&&b1!=0)}}

}if(c>=c1&&c1!=0)}}

}if(d>=d1&&d1!=0)}}

}if(e>=e1&&e1!=0)}}

}return 1;

}void dfs(int px,int py)

,,,},i,j;   

int end=1,head=1,tx,ty;//head和end分別為佇列頭和尾

s[end].x=px;//當前位置入佇列

s[end].y=py;

arr1[px][py]=1;//對走過的地方標記

end++;//end始終指向隊尾

while(end>head)

else if(arr[tx][ty]=='b'&&b

continue;

}else if(arr[tx][ty]=='c'&&c

else if(arr[tx][ty]=='d'&&d                  

else if(arr[tx][ty]=='e'&&e

//遇到鑰匙時收集鑰匙,並把鑰匙的位置初始化為路

else if(arr[tx][ty]=='a')

else if(arr[tx][ty]=='b')

else if(arr[tx][ty]=='c')

else if(arr[tx][ty]=='d')

else if(arr[tx][ty]=='e')

//遇到寶藏返回

if(arr[tx][ty]=='g')

//滿足條件的位置入佇列,並進行標記

s[end].x=tx;

s[end].y=ty; 

arr1[tx][ty]=1;

end++;

}head++;//隊首位置的座標四個方向嘗試完後出隊}}

NYOJ 迷宮尋寶(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門 n 5 它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這個...

nyoj82迷宮尋寶(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門 n 5 它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這...

迷宮尋寶(一) nyoj 82

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 乙個叫acm的尋寶者找到了乙個藏寶圖,它根據藏寶圖找到了乙個迷宮,這是乙個很特別的迷宮,迷宮裡有n個編過號的門 n 5 它們分別被編號為a,b,c,d,e.為了找到寶藏,acm必須開啟門,但是,開門之前必須在迷宮裡找到這個開啟這...