24分求助,2、7、9、10、14WA,3、4、6、11、13、15、16TLE
查看原帖
24分求助,2、7、9、10、14WA,3、4、6、11、13、15、16TLE
751881
icypenguin/ll楼主2023/1/18 21:15

dfs代码:

#include <iostream>
using namespace std;
struct node{
    int sx = 0,sy = 0,ex = 0,ey = 0;
};
int n,m,startx,starty,endx,endy,small = 1e9,book[305][305];
node cs[300];
char a[305][305];
int dx[10] = {1,-1,0,0};
int dy[10] = {0,0,1,-1};

int dfs(int x, int y, int step){
    if (x == endx && y == endy){
        if (step < small){
            small = step;
        }
        return 0;
    }
    if (a[x][y] >= 'A' && a[x][y] <= 'Z'){
        int sx = cs[int(a[x][y] - 'A')].sx, sy = cs[int(a[x][y] - 'A')].sy, ex = cs[int(a[x][y] - 'A')].ex, ey = cs[int(a[x][y] - 'A')].ey;
        if (x == sx && y == sy){
            if (book[ex][ey] == 0){
                book[ex][ey] = 1;
                dfs(ex,ey,step);
            }else{
                for (int i = 0; i <= 3; i++){
                    int new_x = x + dx[i], new_y = y + dy[i];
                    if (new_x < 1 || new_x > n || new_y < 1 || new_y > m || book[new_x][new_y] > 0 || a[new_x][new_y] == '#'){
                        continue;
                    }
                    book[new_x][new_y]++;
                    dfs(new_x,new_y,step + 1);
                    book[new_x][new_y]--;
                }
            }
        }else{
            if (book[sx][sy] == 0){
                book[sx][sy] = 1;
                dfs(sx,sy,step);
            }else{
                for (int i = 0; i <= 3; i++){
                    int new_x = x + dx[i], new_y = y + dy[i];
                    if (new_x < 1 || new_x > n || new_y < 1 || new_y > m || book[new_x][new_y] > 0 || a[new_x][new_y] == '#'){
                        continue;
                    }
                    book[new_x][new_y]++;
                    dfs(new_x,new_y,step + 1);
                    book[new_x][new_y]--;
                }
            }
        }
    }else{
        for (int i = 0; i <= 3; i++){
            int new_x = x + dx[i], new_y = y + dy[i];
            if (new_x < 1 || new_x > n || new_y < 1 || new_y > m || book[new_x][new_y] > 0 || a[new_x][new_y] == '#'){
                continue;
            }
            book[new_x][new_y]++;
            dfs(new_x,new_y,step + 1);
            book[new_x][new_y]--;
        }
    }
    return 0;
}
int main(){
    cin >> n >> m;
    for (int i = 1; i <= n; i++){
        for (int j = 1; j <= m; j++){
            cin >> a[i][j];
            if (a[i][j] == '@'){
                startx = i;
                starty = j;
            }
            if (a[i][j] == '='){
                endx = i;
                endy = j;
            }
            if (a[i][j] >= 'A' && a[i][j] <= 'Z'){
                if (cs[int(a[i][j] - 'A')].sx == 0){
                    cs[int(a[i][j] - 'A')].sx = i;
                    cs[int(a[i][j] - 'A')].sy = j;
                }else{
                    cs[int(a[i][j] - 'A')].ex = i;
                    cs[int(a[i][j] - 'A')].ey = j;
                }
            }
        }
    }
    book[startx][starty]++;
    dfs(startx,starty,0);
    cout << small << endl;
    return 0;
}
2023/1/18 21:15
加载中...