就差十分....救命啊

P3956 [NOIP2017 普及组] 棋盘

@[wangzll](/user/506524) 题目中上下左右都可以走,但你的代码在 判定是否出界 与 施展魔法 都只考虑了向右下的方向。
by xutongwei @ 2022-08-03 15:08:02


我把它当做了一个剪枝@[xutongwei](/user/223588)
by wangzll @ 2022-08-03 15:22:37


结果还是错的@[xutongwei](/user/223588)
by wangzll @ 2022-08-03 15:29:27


@[wangzll](/user/506524) 在 施展魔法 时,不能用 else,因为施展魔法后上下左右四种情况,一样要用 for 分类讨论。 把这里改了就 AC 了。(竟然没有TLE……) ```cpp #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int n,m,a[1005][1005],minn = 0x3f3f3f,num[1005][1005]; int dx[] = {-1,1,0,-1,0},dy[] = {-1,0,1,0,-1}; void dfs(int x,int y,int money) { //<<x<<" "<<y<<" "<<money<<" "<<a[x][y]<<endl; if(x == n&&y == n) {minn = min(minn,money);return;} for(int i = 1;i <= 4;i++) { int xx = x + dx[i],yy = y + dy[i],money1 = money; if(xx > n||yy > n || xx < 1 || yy < 1) continue; if(a[xx][yy] != a[x][y]&&a[xx][yy] != -1) money1 ++; else if(a[xx][yy] == -1){ if(xx == n&&yy == n) money1 += 2; else{ for(int j = 1; j <= 4; j++){ int xxx = xx + dx[j],yyy = yy + dy[j],money2=money1; if(xxx > n||yyy > n || xxx < 1 || yyy < 1) continue; if(a[xxx][yyy] != -1 && !(xxx == x && yyy == y)) { if(a[xxx][yyy] == a[x][y])money2 += 2; else money2 += 3; if(money2 < num[xxx][yyy]&&(a[xxx][yyy] != -1||xxx == n&&yyy == n)) { num[xxx][yyy] = money2; dfs(xxx,yyy,money2); } } }continue; } } if(money1 < num[xx][yy]&&(a[xx][yy] != -1||xx == n&&yy == n)) { num[xx][yy] = min(num[xx][yy],money1); dfs(xx,yy,money1); } } } int main() { scanf("%d%d",&n,&m); memset(a,-1,sizeof a); memset(num,0x3f3f3f,sizeof num); for(int i = 1;i <= m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); a[x][y] = z; } dfs(1,1,0); if(minn == 0x3f3f3f) cout<<-1<<endl; else cout<<minn<<endl; return 0; } ```
by xutongwei @ 2022-08-03 16:18:23


好耶,改了2周的题终于过了
by wangzll @ 2022-08-03 20:32:18


本来想着剪枝呢,结果把正确答案给剪掉了
by wangzll @ 2022-08-03 20:32:57


|