|
luogu P1238 走迷宫
3次才AC 第一次 50 第二次 80 第三次 100
分析原因:
1、上下左右看错????
2、初始位置要标记。。。
3、这其实就是一道水题。。。。
迷宫类型问题的基本套路,记得剪枝,不然要tle的。。
AC代码:
- #include <bits/stdc++.h>
- using namespace std;
- int maps[1000][1000];
- int book[1000][1000];
- int a[1000][3];
- int next[4][2] = {{0,-1},{-1,0},{0,1},{1,0}};
- int n,m;
- int flag;
- int p,q,sx,sy;
- void print(int x)
- {
- for(int i = 1;i < x;i++)
- {
- printf("(%d,%d)->",a[i][1],a[i][2]);
- }
- printf("(%d,%d)",a[x][1],a[x][2]);
- printf("\n");
- }
- void dfs(int x,int y,int step)
- {
- int tx,ty;
- if(x == p && y == q)
- {
- flag = 1;
- print(step);
- return;
- }
- for(int k = 0;k <= 3;k++)
- {
- tx = x + next[k][0];
- ty = y + next[k][1];
- if(tx < 1 || tx > n || ty < 1 || ty > m) continue;
- if(book[tx][ty] == 0 && maps[tx][ty] == 1)
- {
- book[tx][ty] = 1;
- a[step+1][1] = tx;
- a[step+1][2] = ty;
- dfs(tx,ty,step+1);
- book[tx][ty] = 0;
- }
- }
- }
- int main()
- {
- int i,j;
- scanf("%d%d",&n,&m);
- for(i = 1;i <= n;i++)
- {
- for(j = 1;j <= m;j++)
- {
- scanf("%d",&maps[i][j]);
- }
- }
- scanf("%d%d",&sx,&sy);
- scanf("%d%d",&p,&q);
- a[1][1] = sx;
- a[1][2] = sy;
- book[sx][sy] = 1;
- dfs(sx,sy,1);
- if(flag == 0)
- {
- printf("-1");
- }
- return 0;
- }
复制代码
|
|