华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1030|回复: 3
打印 上一主题 下一主题

P1605 迷宫

[复制链接]

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
跳转到指定楼层
楼主
发表于 2018-7-20 20:46:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 倚窗倾听风吹雨 于 2018-7-22 11:10 编辑


题目背景
迷宫【问题描述】
给定一个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

回复

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
沙发
 楼主| 发表于 2018-7-20 20:48:24 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
板凳
发表于 2018-8-29 15:59:31 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
地板
发表于 2018-9-19 13:35:49 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-27 00:04 , Processed in 0.134698 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表