#第一个代码:
#include<iostream>
#include<cstring>
using namespace std;
int T;
int n , m;
int G[8][8];
int st[8][8];
int dx[] = {0 , -1 , 1 , 0 , 0 , -1 , -1 , 1 , 1};
int dy[] = {0 , 0 , 0 , -1 , 1 , -1 , 1 , -1 , 1};
int maxn , ans;
void dfs(int x , int y){
if(y == m + 1){
dfs(x + 1 , 1);
return ;
}
if(x == n + 1){
maxn = max(ans , maxn);
return ;
}
dfs(x , y + 1);
if(!st[x][y]){
ans += G[x][y];
for(int i = 1;i <= 8;i++){
st[x + dx[i]][y + dy[i]] = true;
}
dfs(x , y + 1);
for(int i = 1;i <= 8;i++){
st[x + dx[i]][y + dy[i]] = false;
}
ans -= G[x][y];
}
}
int main(){
cin >> T;
while(T--){
memset(G , 0 , sizeof(G));
memset(st , false , sizeof(st));
cin >> n >> m;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
cin >> G[i][j];
}
}
maxn = 0;
dfs(1 , 1);
cout << maxn << endl;
}
}
#两个WA四个TLE #第二个代码:
#include<iostream>
#include<cstring>
using namespace std;
int T;
int n , m;
int G[8][8];
int st[8][8];
int dx[] = {0 , -1 , 1 , 0 , 0 , -1 , -1 , 1 , 1};
int dy[] = {0 , 0 , 0 , -1 , 1 , -1 , 1 , -1 , 1};
int maxn , ans;
void dfs(int x , int y){
if(y == m + 1){
dfs(x + 1 , 1);
return ;
}
if(x == n + 1){
maxn = max(ans , maxn);
return ;
}
dfs(x , y + 1);
if(!st[x][y]){
ans += G[x][y];
for(int i = 1;i <= 8;i++){
++st[x + dx[i]][y + dy[i]];
}
dfs(x , y + 1);
for(int i = 1;i <= 8;i++){
--st[x + dx[i]][y + dy[i]];
}
ans -= G[x][y];
}
}
int main(){
cin >> T;
while(T--){
memset(G , 0 , sizeof(G));
memset(st , false , sizeof(st));
cin >> n >> m;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
cin >> G[i][j];
}
}
maxn = 0;
dfs(1 , 1);
cout << maxn << endl;
}
}
#6个点全部AC 大佬们,为啥把赋值改为自加自减就AC了,蒟蒻求救QwQ