免费学习资源网站,网站连接微信,网站公司排行榜,网站备案查询工信部app题目描述 X星的坦克战车很奇怪#xff0c;它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转#xff0c;否则将报废。 某坦克需要从A区到B区去#xff08;A#xff0c;B区本身是安全区#xff0c;没有正能量或负能量特征#xff09;#xff0c;怎样走才能路径…题目描述 X星的坦克战车很奇怪它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转否则将报废。 某坦克需要从A区到B区去AB区本身是安全区没有正能量或负能量特征怎样走才能路径最短 已知的地图是一个方阵上面用字母标出了AB区其它区都标了正号或负号分别表示正负能量辐射区。 例如
A - -
- - -
- -- -
B - -坦克车只能水平或垂直方向上移动到相邻的区。 输入 输入第一行是一个整数n表示方阵的大小 4n100 接下来是n行每行有n个数据可能是AB-中的某一个中间用空格分开。 输入保证AB都只出现一次。 输出 要求输出一个整数表示坦克从A区到B区的最少移动步数。 如果没有方案则输出-1 样例输入
5
A - -
- - -
- -- -
B - -样例输出
10知识点 gets()和scanf()的区别在于输入的字符串是否中间有空格对于前者只有遇到\n时才停止输入而对于后者出现\n或空格都停止输入。
AC代码如下
#include iostream
#include cstring
#include queue
using namespace std;
const int N 110;
typedef pairint, intPII;
#define x first
#define y second
char g[N][N];
int dis[N][N];
bool st[N][N];
int n;int dx[] {0, 0, 1, -1}, dy[] {1, -1, 0, 0};int bfs(PII start, PII end) {queuePIIq;q.push(start);dis[start.x][start.y] 0;st[start.x][start.y] true;while (q.size()) {PII t q.front();q.pop();for (int i 0; i 4; i) {int xx t.x dx[i], yy t.y dy[i];if (xx 0 || xx n || yy 0 || yy n)continue;if (st[xx][yy])continue;if (g[xx][yy] g[t.x][t.y])continue;st[xx][yy] true;dis[xx][yy] dis[t.x][t.y] 1;if (end make_pair(xx, yy))return dis[xx][yy];q.push({xx, yy});}}return -1;
}int main() {cin n;PII start, end;memset(dis, -1, sizeof(dis));for (int i 0; i n; i) {for (int j 0; j n; j) {cin g[i][j];//因为cin输入遇到空格会停下所以用二重循环来读入if (g[i][j] A)start {i, j};else if (g[i][j] B)end {i, j};}}int distance bfs(start, end);if (distance -1)cout -1 endl;elsecout distance endl;return 0;}错误代码如下
#include iostream
#include cstring
#include queue
using namespace std;
const int N 110;
typedef pairint, intPII;
#define x first
#define y second
char g[N][N];
int dis[N][N];
bool st[N][N];
int n;int dx[] {0, 0, 1, -1}, dy[] {1, -1, 0, 0};int bfs(PII start, PII end) {queuePIIq;q.push(start);dis[start.x][start.y] 0;st[start.x][start.y] true;while (q.size()) {PII t q.front();q.pop();for (int i 0; i 4; i) {int xx t.x dx[i], yy t.y dy[i];if (xx 0 || xx n || yy 0 || yy n)continue;if (st[xx][yy])continue;if (g[xx][yy] g[t.x][t.y])continue;st[xx][yy] true;dis[xx][yy] dis[t.x][t.y] 1;if (end make_pair(xx, yy))return dis[xx][yy];q.push({xx, yy});}}return -1;
}int main() {cin n;PII start, end;memset(dis, -1, sizeof(dis));for (int i 0;in;i){
// scanf(%s,g[i]);cing[i];//这两种输入写法都会遇到空格就停下来for (int j 0;jn;j){if (g[i][j]A) start {i,j};else if (g[i][j]B) end {i,j};}}int distance bfs(start, end);if (distance -1)cout -1 endl;elsecout distance endl;return 0;}AC代码如下
#include iostream
#include queue
using namespace std;
const int N 110;
bool vis[N][N];
char g[N][N];struct node
{int x,y;int p;
};int n;int dx[] {0,0,1,-1},dy[] {1,-1,0,0};int bfs(node s,node e)
{queuenodeq;q.push(s);vis[s.x][s.y] true;while(q.size()){node t q.front();q.pop();if (t.x e.x t.ye.y){return t.p;}for (int i 0;i4;i){int xx t.xdx[i],yy t.ydy[i];if (xx 0 || xx n || yy 0 || yy n || vis[xx][yy]) continue;if (g[xx][yy]g[t.x][t.y]) continue;vis[xx][yy] true;node n;n {xx,yy,t.p1};q.push(n);}}return -1;
}int main()
{cinn;node s,e;for (int i 0;in;i)for (int j 0;jn;j)cing[i][j];for (int i 0;in;i)for (int j 0;jn;j){if (g[i][j]A)s {i,j,0};if (g[i][j]B)e {i,j,0};}coutbfs(s,e)endl;return 0;
}错误代码如下:
下面这个代码为什么不行呢因为int n两次了一次在main函数外一次在main函数里面有时候写代码快的时候容易发生这样的错误还比较难找到。
#include iostream
#include queue
using namespace std;
const int N 110;
bool vis[N][N];
char g[N][N];struct node
{int x,y;int p;
};int n;
int dx[] {0,0,1,-1},dy[] {1,-1,0,0};int bfs(node s,node e)
{queuenodeq;q.push(s);vis[s.x][s.y] true;while(q.size()){node t q.front();q.pop();if (t.x e.x t.ye.y){return t.p;}for (int i 0;i4;i){int xx t.xdx[i],yy t.ydy[i];if (xx 0 || xx n || yy 0 || yy n || vis[xx][yy]) continue;if (g[xx][yy]g[t.x][t.y]) continue;vis[xx][yy] true;node n;n {xx,yy,t.p1};q.push(n);}}return -1;
}int main()
{int n;cinn;node s,e;for (int i 0;in;i)for (int j 0;jn;j)cing[i][j];for (int i 0;in;i)for (int j 0;jn;j){if (g[i][j]A)s {i,j,0};if (g[i][j]B)e {i,j,0};}coutbfs(s,e)endl;return 0;
}