36.迷宫(广度优先搜索)
時間限制: 1 s
?空間限制: 128000 KB
?題目等級 : 黃金 Gold
題解
題目描述?Description
在N*N的迷宮內,“#”為墻,“.”為路,“s”為起點,“e”為終點,一共4個方向可以走。從左上角((0,0)“s”)位置處走到右下角((n-1,n-1)“e”)位置處,可以走通則輸出YES,不可以走則輸出NO。
輸入描述?Input Description
輸入的第一行為一個整數m,表示迷宮的數量。?
其后每個迷宮數據的第一行為一個整數n(n≤16),表示迷宮的邊長,接下來的n行每行n個字符,字符之間沒有空格分隔。
輸出描述?Output Description
輸出有m行,每行對應的迷宮能走,則輸出YES,否則輸出NO。
樣例輸入?Sample Input
1
7
s...##.
.#.....
.......
..#....
..#...#
###...#
......e
樣例輸出?Sample Output
YES
代碼:
(使用遞歸回溯)超時程序:
#include
using namespace std;
#include
#include
int m,p[17][17];
int xx[4]={1,-1,0,0};
int yy[4]={0,0,1,-1};int flag;
void search(int xq,int yq,int xz,int yz,int n)
{
?????? if(xq==xz&&yq==yz)
?????? {
????????????? flag=1;
????????????? return;
?????? }
?????? for(int i=0;i<=3;++i)
?????? {
????????????? int x1=xq+xx[i],y1=yq+yy[i];
????????????? if(x1>=1&&x1<=n&&y1>=1&&y1<=n&&p[x1][y1]==0)
????????????? {
???????????????????? p[x1][y1]=1;
???????????????????? search(x1,y1,xz,yz,n);
???????????????????? p[x1][y1]=0;
???????????????????? if(flag==1)
???????????????????? return;
????????????? }
?????? }
}
?
int main()
{
?????? scanf("%d",&m);
?????? for(int i=1;i<=m;++i)
?????? {
????????????? int n,xq,yq,xz,yz;
????????????? scanf("%d",&n);
????????????? flag=0;
????????????? char bz[17];
????????????? memset(p,0,sizeof(p));
????????????? for(int j=1;j<=n;++j)
????????????? {
???????????????????? scanf("%s",bz+1);
????????????? ??? for(int l=1;l<=n;++l)
???????????????????? {
??????????????????????????? if(bz[l]=='#')
??????????????????????????? p[j][l]=1;
??????????????????????????? if(bz[l]=='.')
??????????????????????????? p[j][l]=0;
??????????????????????????? if(bz[l]=='s')
??????????????????????????? {
?????????????????????????????????? p[j][l]=0;
?????????????????????????????????? xq=l;yq=j;
??????????????????????????? }
????????????? ????????????? if(bz[l]=='e')
??????????????????????????? {
?????????????????????????????????? p[j][l]=0;
?????????????????????????????????? xz=l;
?????????????????????????????????? yz=j;
??????????????????????????? }
???????????????????? }????
????????????? ?
????????????? ? }?
????????????? ?
????????????? search(xq,yq,xz,yz,n);
????????????? if(flag==1)
????????????? printf("YES\n");
????????????? else printf("NO\n");
?????????????
?????? }
?????? return 0;
}
AC程序:(廣搜加隊列):
#include
using namespace std;
#include
#include
int d[17*17][2]={0},head,tail,mg[17][17]={0};
int xx[]={0,0,1,-1};
int yy[]={1,-1,0,0},m;
int search(int n,int xz,int yz)
{
?????? head=0;tail=1;
?????? memset(d,0,sizeof(d));
?????? d[tail][0]=1;d[tail][1]=1;
?????? mg[1][1]=1;
?????? while(head
?????? {
????????????? ++head;
????????????? int x1=d[head][0],y1=d[head][1];
????????????? if(x1==xz&&y1==yz)
????????????? return 1;
????????????? for(int i=0;i<=3;++i)
????????????? {
???????????????????? int x=x1+xx[i],y=y1+yy[i];
???????????????????? if(x>=1&&x<=n&&y>=1&&y<=n&&mg[x][y]==0)
???????????????????? {
??????????????????????????? ++tail;
??????????????????????????? d[tail][0]=x;
??????????????????????????? d[tail][1]=y;
??????????????????????????? mg[x][y]=1;
???????????????????? }
????????????? }
?????? }
?????? return 0;
}
void input()
{
?????? char p[17];
?????? scanf("%d",&m);
?????? int xq=1,xz,n,yq=1,yz;
?????? mg[1][1]=1;
?????? for(int i=1;i<=m;++i)
?????? {
????????????? scanf("%d",&n);
????????????? xz=n;yz=n;
?????? ? for(int l=1;l<=n;++l)
?????? ? {
????????????? scanf("%s",p+1);
?????????????
????????????? for(int j=1;j<=n;++j)
????????????? {
???????????????????? if(p[j]=='#')
???????????????????? mg[l][j]=1;
????????????? }
?????? ?}???
?????? ??? int flag=search(n,xz,yz);
????????????? if(flag==1) printf("YES\n");
????????????? else printf("NO\n");
?????? }
}
int main()
{
?????? input();
?????? return 0;
}
轉載于:https://www.cnblogs.com/csgc0131123/p/5290451.html
總結
以上是生活随笔為你收集整理的36.迷宫(广度优先搜索)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动端 像素渲染流水线与GPU Hac
- 下一篇: python学习:time、unixti