社区讨论

一个题目,四种颜色 HELP

P1930[USACO3.3] 亚瑟王的宫殿参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi86bbp6
此快照首次捕获于
2025/11/21 09:20
4 个月前
此快照最后确认于
2025/11/21 09:20
4 个月前
查看原帖
Z4KJdU.png
  • 蒟蒻求改题目
  • 不是妹子
C
#include <cstring>//代码太丑,勿喷
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;
int n,m,t=0,kingx,kingy,d[45][30][45][30],a[45][30],g[9][2]={{0,0},{1,2},{2,1},{-1,2},{2,-1},{-1,-2},{-2,-1},{1,-2},{-2,1}};

struct node{
	int x,y;
}f[1350];

inline bool ok(int x,int y)
{
	if (x<1||x>8||y<1||y>8) return false;
	return true;
}

void bds(int s1,int s2)
{
	int q[1350][2],s,t,i,x,y;
	memset(q,0,sizeof(q));
	s=0; t=1; q[1][0]=s1; q[1][1]=s2;
	while (s<t)
	{
		s++;
		for (i=1; i<=8; i++)
		{
			x=q[s][0]+g[i][0];
			y=q[s][1]+g[i][1];
			if (ok(x,y))
				if ((x!=s1||y!=s2)&&d[s1][s2][x][y]==0)
				{
					d[s1][s2][x][y]=d[s1][s2][q[s][0]][q[s][1]]+1;
					t++; q[t][0]=x; q[t][1]=y;
				}
		}
	}
}

int main()
{
	int i,j,x,y,k,tmp,ans=99999999,ams;
	char ch,chs;
	scanf ("%d%d\n",&n,&m);
	cin>>ch>>chs;
	kingy=ch-64; kingx=chs-48;
	chs=getchar();
	while (cin>>ch)
	{
		t++;
		f[t].y=ch-64;
		cin>>ch;
		f[t].x=ch-48;
	}
	for (i=1; i<=n; i++)
	{
		for (j=1; j<=m; j++)
		{
			bds(i,j);
			for (k=1; k<=t; k++) a[i][j]+=d[i][j][f[k].x][f[k].y];
		}
	}
	for (i=1; i<=n; i++)
		for (j=1; j<=m; j++)
		{
			ams=a[i][j]+abs(kingx-i)+abs(kingy-j);
			for (x=1; x<=n; x++)
				for (y=1; y<=m; y++)
					for (k=1; k<=t; k++)
					{
						tmp=a[i][j]-d[f[k].x][f[k].y][i][j]+d[f[k].x][f[k].y][x][y]+abs(kingx-x)+abs(kingy-y)+d[x][y][i][j];
						if (tmp<ams) ams=tmp;
					}
			if (ams<ans) ans=ams;
		}
	printf ("%d\n",ans);
	return 0;
}
再次谢谢神犇们,迷之一笑o(≧v≦)o-好棒

回复

3 条回复,欢迎继续交流。

正在加载回复...