对我AC代码的HACK
查看原帖
对我AC代码的HACK
636442
yangyang1000楼主2024/1/28 16:31

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
2024/1/28 16:31
加载中...