poj 1573 栈的应用(Robot Motion)

本文介绍了一种用于处理给定矩阵指令的算法,该算法通过栈记录到达过的矩阵位置,判断移动路径是否出现循环,并在遇到边界或循环时进行相应输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给定一个n*m的矩阵指令,每个位置为‘W’,‘S’,‘N’,‘E’四个指令之一,表示四个方向。给定一个入口位置,按照所在点的指令移动。当移动出矩形区域或者出现循环的时候输出按要求进行相应输出。

思路:用一个栈记录到达过的位置。判断循环是否出现也就是当前位置是否在栈中出现。

#include <stdio.h>
#include <string.h>
char s[15][15];
struct point{
	int x,y;
}stack[105];
int n,m,b,top;
int outbound(int x,int y){//(x,y)是否已经到了矩形区域外
	if(x<0||y<0||x>=n||y>=m)
		return 1;
	return 0;
}
int hasrepead(int x,int y){//(x,y)是否在栈中出现过,返回i+1是为了当i为0的时候也能够表示出现循环
	int i;
	for(i = 0;i<=top;i++)
		if(stack[i].x == x&& stack[i].y == y)
			return i+1;
	return 0;
}
int main(){
	freopen("a.txt","r",stdin);
	while(scanf("%d %d %d",&n,&m,&b) &&(n+m+b)){
		int i,x,y;
		top = -1;
		for(i = 0;i<n;i++)
			scanf("%s",s[i]);
		stack[++top].x = x = 0;
		stack[top].y = y = b-1;
		while(1){
			switch(s[x][y]){
				case 'N':
					x--;
					break;
				case 'W':
					y--;
					break;
				case 'S':
					x++;
					break;
				case 'E':
					y++;
					break;
			}
			if(outbound(x,y)){
				printf("%d step(s) to exit\n",top+1);
				break;
			}
			if(i = hasrepead(x,y)){
				printf("%d step(s) before a loop of %d step(s)\n",i-1,top-i+2);
				break;
			}
			stack[++top].x = x;
			stack[top].y = y;
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值