ZOJ 3865 Superbot
来源:互联网 发布:单片机 蓝牙 app 编辑:程序博客网 时间:2024/06/17 03:54
解题思路:
简单的bfs, 记录一下当前的键盘状态。
#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#define ll long longusing namespace std;int Move[][2] = { {0, -1}, {0, 1}, {-1, 0}, {1, 0} };int dp[20][20][5];char g[20][20];int ex, ey;int n, m, p;struct Point{ int x, y, dir; Point(int _x = 0, int _y = 0, int _dir = 0) { x = _x; y = _y; dir = _dir; }};bool check(int x, int y){ if(x < 0 || x >= n || y < 0 || y >= m) return false; if(g[x][y] == '*') return false; return true;}int bfs(int sx, int sy){ //cout << sx << ' ' << sy << ' ' << endl; // cout << ex << ' ' << ey << ' ' << endl; memset(dp, -1, sizeof(dp)); queue<Point>Q; Q.push(Point(sx, sy, 0)); dp[sx][sy][0] = 0; while(!Q.empty()) { Point pre = Q.front(); Q.pop(); int px = pre.x; int py = pre.y; int pd = pre.dir; if(px == ex && py == ey) return dp[ex][ey][pd]; int nx, ny, nd; //什么都不做 nx = px, ny = py, nd = pd; if(dp[px][py][pd] >= 0 && dp[px][py][pd] % p == p - 1)//如果恰好键盘转动 nd = (nd + 3) % 4; if(dp[nx][ny][nd] == -1) { dp[nx][ny][nd] = dp[px][py][pd] + 1; Q.push(Point(nx, ny, nd)); } //按下当前的键 nx = px + Move[pd][0]; ny = py + Move[pd][1]; nd = pd; if(check(nx, ny)) { if(dp[px][py][pd] >= 0 && dp[px][py][pd] % p == p - 1) nd = (nd + 3) % 4; if(dp[nx][ny][nd] == -1) { dp[nx][ny][nd] = dp[px][py][pd] + 1; Q.push(Point(nx, ny, nd)); } } //向左移动键盘 nx = px; ny = py; nd = (pd + 3) % 4; if(dp[px][py][pd] >= 0 && dp[px][py][pd] % p == p-1) nd = (nd + 3) % 4; if(dp[nx][ny][nd] == -1) { dp[nx][ny][nd] = dp[px][py][pd] + 1; Q.push(Point(nx, ny, nd)); } //向右移动键盘 nx = px; ny = py; nd = (pd + 1) % 4; if(dp[px][py][pd] >= 0 && dp[px][py][pd] % p == p-1) nd = (nd + 3) % 4; if(dp[nx][ny][nd] == -1) { dp[nx][ny][nd] = dp[px][py][pd] + 1; Q.push(Point(nx, ny, nd)); } } return -1;}int main(){ int T; scanf("%d", &T); while(T--) { scanf("%d%d%d", &n, &m, &p); int sx, sy; for(int i=0;i<n;i++) scanf("%s", g[i]); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(g[i][j] == '@') { sx = i; sy = j; } if(g[i][j] == '$') { ex = i; ey = j; } } } //cout << sx << ' ' << sy << ' ' << endl; int ans = bfs(sx, sy); if(ans == -1) printf("YouBadbad\n"); else printf("%d\n", ans); } return 0;}
0 0
- ZOJ 3865 Superbot BFS
- ZOJ 3865 Superbot
- ZOJ 3865 - Superbot(BFS)
- [bfs] zoj 3865 Superbot
- ZOJ 3865 Superbot
- ZOJ 3865 Superbot
- ZOJ-3865 Superbot
- ZOJ 3865 Superbot(广搜)
- zoj 3865 Superbot(BFS)
- zoj 3865 Superbot (广搜)
- zoj 3865 Superbot(搜索)
- ZOJ 3865 Superbot(BFS)
- ZOJ 3865 Superbot(BFS水题)
- zoj superbot (bfs)
- zoj 3865Superbot BFS 根据会动的↑↓←→让机器人找钻石
- (BFS)Superbot
- ZOJ3865:Superbot(BFS)
- ZOJ
- 机器学习开源库和项目总结-译文
- P122第20题
- 基于REST的Webservice
- response 生成图片验证码
- Visual Studio Command Prompt 工具配置方法
- ZOJ 3865 Superbot
- 关于mysql数据类型的一点所得
- POJ2342 Anniversary party
- byteorder.h学习
- ScrollView嵌套GridView,只给GridView分发点击事件
- 设置了UIControlStateDisabled却无效
- [leetcode]Reverse Linked List II (反转链表值 C语言实现)
- PopupWindow用法
- Linux---ifconfig命令