华师一附中OI组

标题: P1605 迷宫 [打印本页]

作者: 倚窗倾听风吹雨    时间: 2018-7-20 20:46
标题: P1605 迷宫
本帖最后由 倚窗倾听风吹雨 于 2018-7-22 11:10 编辑

https://www.luogu.org/problemnew/show/P1605

题目背景
迷宫【问题描述】
给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和
终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫
中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
输入样例输出样例
【数据规模】
1N,M5
题目描述
输入输出格式
输入格式:
【输入】
第一行NMTN为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点
坐标FX,FY。接下来T行,每行为障碍点的坐标。
输出格式:
【输出】
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方
案总数。
输入输出样例
输入样例#1:复制
2 2 1
1 1 2 2
1 2
输出样例#1:复制
1


作者: 倚窗倾听风吹雨    时间: 2018-7-20 20:48
  1. #include<iostream>
  2. using namespace std;
  3. int n,m,t,sx,sy,fx,fy,q,p,ans;
  4. int yd[4]={-1,0,+1,0},xd[4]={0,-1,0,+1};
  5. bool za[10][10],a[10][10];
  6. void dfs(int x,int y)
  7. {
  8.     if(x<=0 || x>n || y<=0 || y>m)
  9.     return;
  10.     if(za[x][y]==1)return;
  11.     if(x==fx && y==fy)
  12.     {
  13.         ans++;
  14.         return;
  15.     }
  16.     for(int i=0;i<=3;i++)
  17.     {
  18.         if(a[x][y]==0)
  19.         {
  20.             a[x][y]=1;
  21.                 dfs(x+xd[i],y+yd[i]);
  22.                 a[x][y]=0;
  23.         }
  24.     }
  25. }
  26. int main()
  27. {
  28.     cin>>n>>m>>t;
  29.     cin>>sx>>sy>>fx>>fy;
  30.     for(int i=1;i<=t;i++)
  31.     {
  32.         cin>>q>>p;
  33.         za[q][p]=1;
  34.     }
  35.     dfs(sx,sy);
  36.     cout<<ans;
  37.     return 0;
  38. }
复制代码

作者: 黄煦喆    时间: 2018-8-29 15:59
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int m,n,t,num,b[7][7];
  5. int sx,sy,fx,fy,ix,iy;
  6. int dx[4]={+1,-1,0,0};
  7. int dy[4]={0,0,-1,+1};
  8. void ms(int x,int y)
  9. {
  10.     if(x==fx&&y==fy)
  11.     {
  12.         num++;
  13.         return;
  14.     }
  15.     for(int i=0;i<=3;i++)
  16.     {
  17.         int tx=x+dx[i];
  18.         int ty=y+dy[i];
  19.         if(!b[tx][ty])
  20.         {
  21.             b[tx][ty]=1;
  22.             ms(tx,ty);
  23.             b[tx][ty]=0;
  24.         }
  25.     }
  26. }
  27. int main()
  28. {
  29.     cin>>n>>m>>t;
  30.     memset(b,0,sizeof(b));
  31.     for(int i=0;i<=m+1;i++)b[0][i]=b[n+1][i]=1;
  32.     for(int j=0;j<=n+1;j++)b[j][0]=b[j][m+1]=1;
  33.     cin>>sx>>sy>>fx>>fy;
  34.     for(int i=1;i<=t;i++){cin>>ix>>iy;b[ix][iy]=1;}
  35.     b[sx][sy]=1;
  36.     ms(sx,sy);
  37.     cout<<num;
  38.     return 0;
  39. }
复制代码

作者: universehyf    时间: 2018-9-19 13:35
  1. #include<iostream>
  2. using namespace std;
  3. int m,n,t,sx,sy,fx,fy,x,y,ans;
  4. int dx[4]={-1,0,1,0},
  5.     dy[4]={0,-1,0,1};
  6. bool b[10][10];
  7. void dfs()
  8. {
  9.     for(int i=0;i<=3;i++)
  10.         if(x+dx[i]>=1&&y+dy[i]>=1&&x+dx[i]<=m&&y+dy[i]<=n&&(!b[x+dx[i]][y+dy[i]]))
  11.         {
  12.             x+=dx[i];y+=dy[i];
  13.             b[x][y]=1;
  14.             if(x==fx&&y==fy) ans++;
  15.             else dfs();
  16.             b[x][y]=0;
  17.             x-=dx[i];y-=dy[i];
  18.         }
  19. }
  20. int main()
  21. {
  22.     cin>>m>>n>>t;
  23.     cin>>sx>>sy>>fx>>fy;
  24.     for(int i=0;i<t;i++)
  25.     {
  26.         cin>>x>>y;
  27.         b[x][y]=1;
  28.     }
  29.     b[sx][sy]=1;
  30.     x=sx;y=sy;dfs();
  31.     cout<<ans;
  32.     return 0;
  33. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2