#include <stdio.h>

struct node{
    int x;
    int y;
    int step;
}first;

int zx[4]={-1,0,1,0};
int zy[4]={0,-1,0,1};
int a[10][10];

node queue[100]={0};
int head=0,tail=0;
int b[10][10]={0};
int flagx,flagy,flag1x,flag1y;

//进栈
void  en(node E)
{
    queue[tail++]=E;
}

//出栈
node qe()
{
    return queue[head++];
}

void bfs()
{
    first.x=flagx;
    first.y=flagy;
    en(first);
    b[first.x][first.y]=1;
    node cur={};
    node ns={};
	int d1=1,d2=0,d3=0,d4=0;
    while(head<tail)
    {
        cur=qe();
		printf("%d %d\n",cur.x ,cur.y);
        if(cur.x==flag1x&&cur.y==flag1y)
        {
            printf("%d\n",cur.step);
            break;
        }

            for(int i=0;i<4;i++)
            {
				ns=cur;
				ns.x=ns.x+zx[i];
				ns.y=ns.y+zy[i];
				//直走
				if(i==0)
				{
					if(a[ns.x][ns.y]=='.'||a[ns.x][ns.y]=='T')
					{
						if(!b[ns.x][ns.y])
						{
							b[ns.x][ns.y]=1;
							d1++;
							d2=0;
							d3=0;
							d4=0;
							if(d1==1)
								ns.step++;
							ns.step++;
							printf("step=%d\n",ns.step);
							en(ns);

						}
					}
				}
				//后退
				if(i==2)
				{
					if(a[ns.x][ns.y]=='.'||a[ns.x][ns.y]=='T')
					{
						if(!b[ns.x][ns.y])
						{
							b[ns.x][ns.y]=1;
							d1=0;
							d2=0;
							d3=0;
							d4++;
							if(d4==1)
								ns.step++;
							ns.step++;
							printf("step=%d\n",ns.step);
							en(ns);
						}
					}
				}
				//左转
				if(i==1)
				{
					if(a[ns.x][ns.y]=='.'||a[ns.x][ns.y]=='T')
					{
						if(!b[ns.x][ns.y])
						{
							b[ns.x][ns.y]=1;
							d1=0;
							d2++;
							d3=0;
							d4=0;
							if(d2==1)
								ns.step++;
							ns.step++;
						printf("step=%d\n",ns.step);
							en(ns);
						}
					}
				}
				//右转
				if(i==3)
				{
					if(a[ns.x][ns.y]=='.'||a[ns.x][ns.y]=='T')
					{
						if(!b[ns.x][ns.y])
						{
							b[ns.x][ns.y]=1;
							d1=0;
							d2=0;
							d3++;
							d4=0;
							if(d3==1)
								ns.step++;
							ns.step++;
							printf("step=%d\n",ns.step);
							en(ns);
						}
					}
				}
			 }
      }
}

void main()
{
    int t,w,l;
        scanf("%d %d",&w,&l);
        for(int i=0;i<w;i++)
        {
            getchar();
            for(int j=0;j<l;j++)
            {
                scanf("%c",&a[i][j]);
                if(a[i][j]=='S')
                {
                    flagx=i;
                    flagy=j;
                    a[i][j]='#';
                }

                if(a[i][j]=='T')
                {
                    flag1x=i;
                    flag1y=j;
                }
            }
        }
        first.step=0;
        bfs();

}

  

TOJ2470的更多相关文章

随机推荐

  1. 201621123008 《Java程序设计》 第三周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词,如类.对象.封装等 关键词:类,构造函数,方法重载,方法覆盖,封装,继承,多态,类被加载的过程,static,abstract, ...

  2. 一名优秀的UI设计师应该具备哪些条件?

    想做好一个好的UI设计师除了应该具有一定的审美能力,还要了解整个产品的开发过程,因为目前国内的软件行业还不能对UI设计形成应有的重视度,所以对我们的要求就更高了,你要能作出夺人眼球的东西,还要站在用户 ...

  3. sc start service 1063 1053 错误原因

    在进入点函数里面要完成ServiceMain的初始化,准确点说是初始化一个SERVICE_TABLE_ENTRY结构数组,这个结构记录了这个服务程序里面所包含的所有服务的名称和服务的进入点函数,下面是 ...

  4. conn not captured

    线程 和 事件中 变量 not captured 把变量定义为 static 或者添加为全局变量(放在main之前)

  5. wcf服务契约代理链

    意图:为了是客户端代理呈现出面向对象的多态的特征 a. 服务端 .契约 实现了契约的继承这个在服务端是一点问题没有,因为oprationcontract可以继承,虽然DataContract不能实现继 ...

  6. Android窗口背景的优化

    视图有背景,每个窗口也是有背景的.每一Activity是一个窗口,每一个Activity都有不同得背景.界面的绘画顺序如下:窗口——跟视图 ——子视图.当我们的跟视图已经覆盖了整个窗口的时候 ,程序还 ...

  7. 47 On Interpersonal Relationship 关于人际关系

    47 On Interpersonal Relationship 关于人际关系 ①Since we are social beings, the quality of our lives depend ...

  8. stark 增删改

    优雅装饰器 import functools def wrapper(func): @functools.wraps(func) # 保留原函数的信息 def inner(*args, **kwarg ...

  9. Fortran 语法之流程控制

    -----------------------

  10. WPF图形图像相关类

    BitmapMetadata类: 继承自抽象类ImageMetadata,包含图像的原数据信息,如相机型号.图像修改程序名称.拍照日期.拍照地点等.ImageSoure类包含ImageMetadata ...