P1605 迷宫
这是一道毒瘤题。。。
这是一道广搜题 bfs 。。。
注释:
1.memcpy(b,a,sizeof(a))
把 a 的值全部复制给 b
memcpy(b,a,sizeof(int)*k)
把 a 中的 k 个元素复制给 b
头文件:#include<cstring>
代码:
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<string> #include<cstring> #include<queue> using namespace std; int n,m,t,sx,sy,fx,fy,tx,ty,ans=0; bool vis[10][10]; //表示是否为墙 int dx[4]={-1,1,0,0}, dy[4]={0,0,-1,1}; struct pos //结构体 x代表横坐标,y代表纵坐标,used[][]代表是否走过 { int x,y,used[10][10]; }; bool pan(int x,int y) //判断是否合法 { return x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0; } pos sa; void bfs() { queue<pos>q; //队列 sa.x=sx; sa.y=sy; sa.used[sx][sy]=1; //标记已走 q.push(sa); //入队 while(!q.empty()) { pos h=q.front(); q.pop(); //出队 for(int i=0;i<=3;i++) { int xx=h.x+dx[i]; int yy=h.y+dy[i]; if(h.used[xx][yy]||(!pan(xx,yy))) //不可以走 continue ; if(xx==fx&&yy==fy) //到终点 { ans++; continue ; } sa.x=xx; sa.y=yy; memcpy(sa.used,h.used,sizeof(h.used)); //鬼知道这是干什么哒(我知道了)注释1 sa.used[xx][yy]=1; q.push(sa); //新的入队 } } } int main() { cin>>n>>m>>t; cin>>sx>>sy>>fx>>fy; for(int i=1;i<=t;i++) { cin>>tx>>ty; vis[tx][ty]=1; } bfs(); //广搜 cout<<ans; return 0; }
这还是一道深搜题 dfs 。。。
回顾一下递归回溯算法框架:
int search(int x,int y) { if(到目的地) 输出解;
else for(int i=1;i<=算符种数;i++) { if(符合条件) { 保存结果;
search(下一层);
恢复:保存结果之前的状态{回溯}; } } }
代码:
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<string> #include<cstring> #include<queue> using namespace std; int n,m,t,sx,sy,fx,fy,tx,ty,ans=0; bool vis[10][10]; int dx[4]={-1,1,0,0}, dy[4]={0,0,-1,1}; bool pan(int x,int y) { return x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0; } void dfs(int x,int y) { if(x==fx&&y==fy) ans++; for(int i=0;i<=3;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(pan(xx,yy)) { vis[xx][yy]=1; dfs(xx,yy); vis[xx][yy]=0; } } } int main() { cin>>n>>m>>t; cin>>sx>>sy>>fx>>fy; for(int i=1;i<=t;i++) { cin>>tx>>ty; vis[tx][ty]=1; } vis[sx][sy]=1; dfs(sx,sy); cout<<ans; return 0; }