来自一只可爱、弱小又无助的蒟蒻的呻吟

P3956 [NOIP2017 普及组] 棋盘

```cpp #include<iostream> #include<cstdio> #include<queue> #include<cmath> #include<cstring> #include <algorithm> using namespace std; int tu[105][105],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; bool pao[105][105]; int m,n,num=100000000; void dfs(int x,int y,int ans){ if(ans>=num)return; if(x==m&&y==m){ num=min(ans,num); return; } for(int i=0;i<4;i++){ int a=x+dx[i],b=y+dy[i]; if(pao[a][b])continue; if(a<1||b<1||a>m||b>m)continue; if(tu[x][y]==0&&tu[a][b]==0)continue; pao[a][b]=1; if(tu[x][y]==0&&tu[a][b]!=0)dfs(a,b,ans); else if(tu[x][y]!=0&&tu[a][b]==0)dfs(a,b,ans+2); else if(tu[x][y]==tu[a][b]){ dfs(a,b,ans); }else{ dfs(a,b,ans+1); } pao[a][b]=0; } return; } int main() { cin>>m>>n; pao[1][1]=1; int a,b,c; for(int i=0;i<n;i++){ scanf("%d%d%d",&a,&b,&c); tu[a][b]=c+1; } dfs(1,1,0); if(num==100000000){ cout<<"-1"<<endl; } else cout<<num<<endl; return 0; } ```
by 谬悠 @ 2019-08-31 20:57:24


[蒟蒻惨状](https://www.luogu.org/record/23537661)
by 谬悠 @ 2019-08-31 20:59:04


~~我居然写过这道题~~ 不管了 丢上我的爆搜 ~~~c++ #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) #define rep(i,a,b) for(int i=(a);i<=(b);++i) #define dwn(i,a,b) for(int i=(a);i>=(b);--i) using namespace std; typedef long long ll; typedef pair<int,int> P; int n,m,a[1010][1010],d[1010][1010],temp[1010][1010]; int dictx[4]={1,-1,0,0},dicty[4]={0,0,1,-1}; queue<P> que; void bfs() { d[1][1]=0; que.push(P(1,1)); while(!que.empty()) { int x=que.front().first,y=que.front().second; que.pop(); if(x*y==0) continue; for(int i=0;i<4;++i) { int dx=dictx[i],dy=dicty[i]; if(a[x+dx][y+dy]==0&&a[x][y]!=0) { if(d[x+dx][y+dy]>d[x][y]+2) { d[x+dx][y+dy]=d[x][y]+2; temp[x+dx][y+dy]=a[x][y]; que.push(P(x+dx,y+dy)); } else if(d[x+dx][y+dy]==d[x][y]+2) { if(temp[x+dx][y+dy]!=a[x][y]) temp[x+dx][y+dy]=10; } } if(a[x+dx][y+dy]!=0&&a[x][y]!=0&&a[x][y]!=a[x+dx][y+dy]) { if(d[x+dx][y+dy]>d[x][y]+1) { d[x+dx][y+dy]=d[x][y]+1; que.push(P(x+dx,y+dy)); } } if(a[x+dx][y+dy]!=0&&a[x][y]==0) { if(temp[x][y]==a[x+dx][y+dy]||temp[x][y]==10) { if(d[x+dx][y+dy]>d[x][y]) { d[x+dx][y+dy]=d[x][y]; que.push(P(x+dx,y+dy)); } } else if(temp[x][y]!=0) { if(d[x+dx][y+dy]>d[x][y]+1) { d[x+dx][y+dy]=d[x][y]+1; que.push(P(x+dx,y+dy)); } } //temp[x][y]==0; } if(a[x+dx][y+dy]!=0&&a[x][y]!=0&&a[x][y]==a[x+dx][y+dy]) { if(d[x+dx][y+dy]>d[x][y]) { d[x+dx][y+dy]=d[x][y]; que.push(P(x+dx,y+dy)); } } } } } int main() { scanf("%d%d",&n,&m); memset(d,127,sizeof(d)); rep(i,1,m) { int x,y,z; scanf("%d%d%d",&x,&y,&z); a[x][y]=z+1; } bfs(); if(d[n][n]!=d[0][0]) { printf("%d\n",d[n][n]); } else printf("-1\n"); return 0; } ~~~
by ZhuMingYang @ 2019-08-31 21:03:09


@[ZhuMingYang](/space/show?uid=128523) 大佬能帮忙看看程序吗,我感觉思路蛮好的QAQ
by 谬悠 @ 2019-08-31 21:04:38


@[谬悠](/space/show?uid=234271) 调试要自己调哦
by ZhuMingYang @ 2019-08-31 21:07:19


@[ZhuMingYang](/space/show?uid=128523) 我懵逼了QAQ
by 谬悠 @ 2019-08-31 21:07:57


```cpp #include<iostream> #include<cstdio> #include<queue> #include<cmath> #include<cstring> #include <algorithm> using namespace std; int tu[105][105],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0}; int pao[105][105]; int m,n,num=0x7fffffff; void dfs(int x,int y,int ans){ if(ans>=pao[x][y])return; pao[x][y]=ans; if(x==m&&y==m){ num=min(ans,num); return; } for(int i=0;i<4;i++){ int a=x+dx[i],b=y+dy[i]; if(a<1||b<1||a>m||b>m)continue; if(tu[x][y]==0&&tu[a][b]==0)continue; if(tu[x][y]==0&&tu[a][b]!=0)dfs(a,b,ans); else if(tu[x][y]!=0&&tu[a][b]==0)dfs(a,b,ans+2); else if(tu[x][y]==tu[a][b]) dfs(a,b,ans); else dfs(a,b,ans+1); } return; } int main() { memset(pao,0x7f,sizeof(pao)); cin>>m>>n; int a,b,c; for(int i=0;i<n;i++){ scanf("%d%d%d",&a,&b,&c); tu[a][b]=c+1; } dfs(1,1,0); if(num==0x7fffffff){ cout<<"-1"<<endl; } else cout<<num<<endl; return 0; } ```
by 谬悠 @ 2019-08-31 21:25:34


25分懵逼
by 谬悠 @ 2019-08-31 21:25:42


@[谬悠](/space/show?uid=234271) if(tu[x][y]==0&&tu[a][b]!=0)dfs(a,b,ans); 这句话应当是有问题的, tu[x][y] == 0 说明现在这个格子是无色的,而可以站上去是因为它被暂时变成了上一次变它的颜色(即转移到(x,y)的格子的颜色)。 而tu[a][b] != 0则有红和黄两种情况,无法确定是否和(x,y)被变的颜色一致,如果颜色不同是不能走的,所以不能直接搜下去。 可以考虑多一个参数来记颜色。 TLE的问题开记忆化可以解决。
by vzyx @ 2019-08-31 21:26:59


@[vzyx](/space/show?uid=136985) 欸? 请问 不是可以吧无色改变成任何颜色吗 那么红 白 黄用两个金钱不就可以了吗QAQ
by 谬悠 @ 2019-08-31 21:29:18


| 下一页