RT,我这么离谱的程序在洛谷上竟然获得了满分:
#include<iostream>
using namespace std;
#define int long long
const int N = 100;
int n,m,k1,k2,ans = 9e18;
bool vis[N][N];
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
struct node
{
int x,y;
} pos[N];
void dfs(int x,int y,int id,int maxv)
{
if(vis[x][y-1] == true && vis[x][y+1] == true && vis[x+1][y] == false && vis[x-1][y] == false) return ;
if(vis[x][y-1] == false && vis[x][y+1] == false && vis[x+1][y] == true && vis[x-1][y] == true) return ;
if(id > n * m / 2)
{
int p = id - (n * m / 2);
maxv = max(maxv,k1 * abs(pos[p].x - pos[id].x) + k2 * abs(pos[p].y - pos[id].y));
}
if(maxv > ans) return ;
if(id == n * m)
{
ans = maxv;
return ;
}
for(int i=0;i<=3;i++)
{
int newx = x + dx[i];
int newy = y + dy[i];
if(newx < 1 || newx > n || newy < 1 || newy > m || vis[newx][newy] == true) continue;
pos[id+1].x = x;
pos[id+1].y = y;
vis[newx][newy] = true;
dfs(newx,newy,id+1,maxv);
vis[newx][newy] = false;
pos[id+1].x = 0;
pos[id+1].y = 0;
}
return ;
}
signed main()
{
cin >> n >> m >> k1 >> k2;
for(int i=1;i<=n;i++) vis[i][0] = true;
for(int j=1;j<=m;j++) vis[0][j] = true;
for(int i=1;i<=n;i++) vis[i][m+1] = true;
for(int j=1;j<=m;j++) vis[n+1][j] = true;
pos[1].x = 1;
pos[1].y = 1;
vis[1][1] = true;
dfs(1,1,1,0);
cout << ans << endl;
return 0;
}
错误出在
pos[id+1].x = x;
pos[id+1].y = y;
这里。应该改为
pos[id+1].x = newx;
pos[id+1].y = newy;
这么离谱的错误洛谷甚至给到了满分。
HACK:
Input:
6 5 12956 12615
Output:
38527