一个题目,四种颜色 HELP

P1930 [USACO3.3] 亚瑟王的宫殿

```cpp #include <cstring> #include <cstdio> #include <cstdlib> #include <iostream> using namespace std; int n,m,t=0,kingx,kingy,d[30][45][30][45],a[30][45],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() { freopen ("gamelot.in","r",stdin); freopen ("gamelot.out","w",stdout); 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); fclose (stdin); fclose (stdout); return 0; } ```
by 逆时针的记忆 @ 2019-07-13 16:49:23


希望更丰富的展现?使用Markdown
by 小玄XX @ 2019-07-13 16:49:30


@[ZZZ……](/space/show?uid=83006) 没换行
by 逆时针的记忆 @ 2019-07-13 16:50:47


|