背景
我好蒻啊,这题打了半天(而且还是暴力)
第一次打紫题(的暴力),有点小激动呢。。。
原题
思路
(我当然只会写暴力)
首先肯定是BFS
这是样例1的图解
题中一个点可以有多次游戏,但是图都是一样的,每次变化的只有ex,ey,sx,sy,tx,ty。
“任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白格子上”就相当于:空白格子可以移动到上下左右的非0格子中。那么每次移动后(ex,ey)一定会变,(sx,sy)可能会变,(tx,ty)一定不变。
那么我们的搜索对象就是:struct Node{int ex,ey,sx,sy,dist;/*走到这个状态的步数*/};
当然还要判重,由于数据规模不大,完全可以用一个四位数组标记。
代码
#include<cstdio> #include<queue> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int n,m,t,g[32][32]= {0},ex,ey,sx,sy,tx,ty; int dx[]= {-1,1,0,0},dy[]= {0,0,-1,1}; struct Node { int ex,ey,sx,sy,dist; }; int vis[32][32][32][32]= {0}; void bfs() { queue<Node> q; Node start; start.ex=ex; start.ey=ey; start.sx=sx; start.sy=sy; start.dist=0; q.push(start); vis[ex][ey][sx][sy]=1; while(!q.empty()) { Node fr=q.front(); q.pop(); if(fr.sx==tx&&fr.sy==ty) { printf("%d ",fr.dist); return; } for(int i=0; i<4; i++) { Node tag=fr; tag.ex=fr.ex+dx[i],tag.ey=fr.ey+dy[i]; if(g[tag.ex][tag.ey]) { tag.dist++; if(tag.ex==fr.sx&&tag.ey==fr.sy) { tag.sx=fr.ex; tag.sy=fr.ey; } if(!vis[tag.ex][tag.ey][tag.sx][tag.sy]) { vis[tag.ex][tag.ey][tag.sx][tag.sy]=1; q.push(tag); } } } } printf("-1 "); } int main() { scanf("%d%d%d",&n,&m,&t); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d",&g[i][j]); while(t--) { scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty); memset(vis,0,sizeof(vis)); if(sx==tx&&sy==ty) { printf("0 "); continue; } bfs(); } return 0; }