洛谷 3956 棋盘
2018-01-06 08:04
197 查看
NOIP血腥的……
#include <cstdio> #include <algorithm> using namespace std; int ans=2147483647,n,m,x,y,t,u; int main(){ freopen("chess.in","r",stdin); freopen("chess.out","w",stdout); printf("%d",-1); return 0; }
好不开心。
后来重新做了一遍,做对了!
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1}; int d[101][101],f[101][101],n,m,x,y,t,ans=2139062143; void dfs(short x,short y,short sum,bool fl){ if (x<1||x>m||y<1||y>m) return;//边界 if (sum>=f[x][y]) return;//超过了不要了 if (x==m&&y==m){ans=(ans>sum)?sum:ans; return;} f[x][y]=sum;//赋值 for (int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if (d[nx][ny]){//有颜色 if (d[nx][ny]==d[x][y]) dfs(nx,ny,sum,0);//颜色相同 else dfs(nx,ny,sum+1,0);//颜色不同 } else if (!d[nx][ny]&&!fl){//没有颜色没有使用魔法 d[nx][ny]=d[x][y];//变颜色 dfs(nx,ny,sum+2,1); d[nx][ny]=0;//回溯 } } } int main(){ scanf("%d%d",&m,&n); f[1][1]=0; memset(f,127,sizeof(f)); for (int i=1;i<=n;i++) scanf("%d%d%d",&x,&y,&t),d[x][y]=t+1; dfs(1,1,0,0); if (ans!=2139062143) printf("%d",ans); else printf("-1"); return 0; }
相关文章推荐
- 洛谷P1549 棋盘问题(2)
- 洛谷 P1169 [ZJOI2007]棋盘制作
- 洛谷 P1436 棋盘分割
- 【洛谷】棋盘制作-悬线法DP
- 洛谷P1117 棋盘游戏
- 洛谷P1117 棋盘游戏
- 洛谷3698 CQOI 2017 小Q的棋盘
- 洛谷 P1436 POJ 1191 [NOI1999 D1T2] 棋盘分割
- [ZJOI2007]棋盘制作(洛谷1169)
- 洛谷 P1169 [ZJOI2007] 棋盘制作
- 【数论】洛谷 P1548 棋盘问题
- 洛谷——P1548 棋盘问题
- 洛谷 P1169 [ZJOI2007]棋盘制作
- 【搜索】棋盘 luogu-3956
- 洛谷 P1169 [ZJOI2007]棋盘制作(bzoj P1057 [ZJOI2007]棋盘制作)
- 洛谷 P1548 棋盘问题
- 洛谷P3956 [NOIp2017]棋盘
- 洛谷 P1169 [ZJOI2007]棋盘制作
- 洛谷P1436 棋盘分割 - NOI99简化版
- 洛谷 P1371 NOI元丹