P1123 求调

题目总版

徐振轩2011 @ 2024-09-15 13:42:56

#include <bits/stdc++.h>
using namespace std;
int t,n,m,ans;
int a[10][10],vis[10][10],vas[10][10];
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,-1,1};
bool check1 (int x,int y){
    return (x < 1 || x > n || y < 1 || y > m || vis[x][y]);
}
bool check2 (int x,int y){
    for (int i = x - 1 ; i <= x + 1 ; i++)
        for (int j = y - 1 ; j <= y + 1 ; j++)
            if (vas[i][j])
                return 0;
    return 1;
}
void dfs (int x,int y,int sum){
    printf ("%d %d\n",x,y);
    if (check1(x,y)){
        ans = max(ans,sum);
        return;
    }
    for (int i = 0 ; i < 4 ; i++){
        int nx = x + dx[i],ny = y + dy[i];
        if (!vis[nx][ny]){
            vis[nx][ny] = 1;
            if (check2(x,y)){
                vas[nx][ny] = 1;
                dfs(nx,ny,sum + a[nx][ny]);
                vas[nx][ny] = 0;
            }
            dfs(nx,ny,sum);
            vis[nx][ny] = 0;
        }
    }
}
int main(){
    cin >> t;
    while (t--){
        cin >> n >> m;
        ans = 0;
        for (int i = 1 ; i <= n ; i++)
            for (int j = 1 ; j <= m ; j++)
                cin >> a[i][j];
        dfs(n / 2,m / 2,0);
        cout << ans << '\n';
    }
    return 0;
}

|