I'm stuck! ccf模拟题。

原创 2016年08月31日 11:49:09

ccf模拟题。

I’m stuck!
时间限制: 1.0s
内存限制: 256.0MB
 
问题描述

给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:

 

'#': 任何时候玩家都不能移动到此方格;

'+': 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;

'-': 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非'#'方格移动一格;

'|': 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非'#'方格移动一格;

'.': 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为'#',则玩家不能再移动;

'S': 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格;

'T': 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非'#'方格移动一格。

此外,玩家不能移动出地图。

请找出满足下面两个性质的方格个数:

1. 玩家可以从初始位置移动到此方格;

2. 玩家可以从此方格移动到目标位置。

输入格式

输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。

接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个'S'和一个'T'。

输出格式
如果玩家在初始位置就已经不能到达终点了,就输出“I'm stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。
样例输入

5 5

--+-+

..|#.

..|##

S-+-T

####.

样例输出
2
样例说明

如果把满足性质的方格在地图上用'X'标记出来的话,地图如下所示:

--+-+

..|#X

..|##

S-+-T

#include<bits/stdc++.h>
int xx[5]={1,-1,0,0};
int yy[5]={0,0,1,-1};
int vis[51][51];
int can[51][51];
char a[51][51];
int r,c;
int flag;
int counter;
void  bfs(int x,int y)
{
  int dx,dy,rear,front;
  rear=front=0;
 
  
    while(front<=rear)
   {     
    if(a[x][y]=='+'||a[x][y]=='S'||a[x][y]=='T')
    {
	  
      for(int i=0;i<4;i++)
       {
       
    	dx=x+xx[i];
        dy=y+yy[i];
        if(dx>=0&&dx<r&&dy>=0&&dy<c&&a[dx][dy]!='#'&&vis[dx][dy]!=1)
        {
       	    vis[dx][dy]=1;
       	    if(flag==0&&a[dx][dy]=='T')
       	    counter++;
       	    if(flag)
       	    can[dx][dy]=1;
        	bfs(dx,dy);
        	rear++;
        	
		}
	  }
	 
		
   }
   else if(a[x][y]=='-')
   {
   	
      for(int i=2;i<4;i++)
      {
    	dx=x+xx[i];
        dy=y+yy[i];
        if(dx>=0&&dx<r&&dy>=0&&dy<c&&a[dx][dy]!='#'&&vis[dx][dy]!=1)
        {  if(flag)
            can[dx][dy]=1;
             if(flag==0&&a[dx][dy]=='T')
       	     counter++;
       	    vis[dx][dy]=1;
        	bfs(dx,dy);
        	rear++;
        	
		}
      }
      
    }
    else if(a[x][y]=='|')
    {
    	
      for(int i=0;i<2;i++)
     {
    	dx=x+xx[i];
        dy=y+yy[i];
        if(dx>=0&&dx<r&&dy>=0&&dy<c&&a[dx][dy]!='#'&&vis[dx][dy]!=1)
        {  vis[dx][dy]=1;
		    if(flag)
       	    can[dx][dy]=1;
       	      if(flag==0&&a[dx][dy]=='T')
       	    counter++;
        	bfs(dx,dy);
        	rear++;
        
		}
	 }

   }
	
	else if(a[x][y]=='.')
	{
		
    
    	dx=x+xx[0];
        dy=y+yy[0];
        if(dx>=0&&dx<r&&dy>=0&&dy<c&&a[dx][dy]!='#'&&vis[dx][dy]!=1)
        {    if(flag)
            can[dx][dy]=1;
            if(flag==0&&a[dx][dy]=='T')
       	    counter++;
       	    vis[dx][dy]=1;
        	bfs(dx,dy);
         	rear++;	
		}	
	}
    front++;
 }
return;
}
int main()
{
    int x_e,x_s,k1=51,k2=51;
	scanf("%d %d",&r,&c);
	memset(vis,0,sizeof(vis));
	memset(can,0,sizeof(can));
	for(int i=0;i<r;i++)
	{
		scanf("%s",&a[i]);
	}
	flag=1;
	for(int i=0;i<r;i++)
	 {
	   for(int j=0;j<c;j++)
		{	
	     if(a[i][j]=='S')
	     {
		   vis[i][j]=1;
		   bfs(i,j);
		}
	   }
     }
	   flag=0;
	   int ans=0;

bfs(0,2);
for(int i=0;i<r;i++)
{
	for(int j=0;j<c;j++)
	{
		if(can[i][j]==1&&a[i][j]!='T'&&a[i][j]!='S')
    	{   memset(vis,0,sizeof(vis));
			ans++;
	    	bfs(i,j);
	    }
	    if(a[i][j]=='T')
	    {
	    	k1=i;
	    	k2=j;
		}
	}
}
    if(can[k1][k2]==1)
	printf("%d",ans-counter);
	else
	printf("I'm stuck!");
}

####X

一开始少了一个vis[dx][dy]=1;30分后来改过来了90分然后才发现我没判断I’m stuck!的条件所幸很简单我又加上了。我觉得我的代码比网上大多数都好理解吧。虽然有点长。


说一下思路吧,一开始时判断能从S到达的点,并把这些点做标记。就是can数组后来在从被标记的点出发看他能不能到T点能的话counter加一最后再用标记的点个数的总数减去那些能到T的点。i'm stuck的条件也很好判断当我再给那些点做标记的时候如果T点没标记的话证明从s出发不能到T;

版权声明:本文为博主原创文章,未经博主允许不得转载。

CCF-CSP-2013年12月-题解

①出现次数最多的数 问题描述   给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。 输入格式   输入的第一行只有一个正整数n(1 ≤ n ...
  • u014355480
  • u014355480
  • 2015年12月11日 16:53
  • 1292

I’m stuck!

http://blog.csdn.net/pipisorry/article/details/39436345 时间限制: 1.0s  内存限制: 256.0MB  问题描述 给定一个...
  • pipisorry
  • pipisorry
  • 2014年09月20日 22:21
  • 1653

CCF 201312-5 I’m stuck! 两次深搜解法

问题描述   给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:   '#': 任何时候玩家都不能...
  • QiangLi_strong
  • QiangLi_strong
  • 2016年04月13日 16:40
  • 1359

CCF 201312-5 I’m stuck!(BFS)

问题描述   给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:   '#': 任何时候玩家都不能...
  • u014679804
  • u014679804
  • 2015年09月04日 19:06
  • 2378

ccf I’m stuck!

问题描述   给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:   '#': 任何时候玩家都不能移...
  • qq_26399665
  • qq_26399665
  • 2016年11月17日 00:59
  • 239

ccf—I'm stuck!

问题描述   给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:   '#': 任何时候玩家都不能移动...
  • var1994
  • var1994
  • 2016年04月08日 23:06
  • 136

CCF I’m stuck!

一、试题问题描述   给定一个R行C列的地图,地图的每一个方格可能是’#’, ‘+’, ‘-‘, ‘|’, ‘.’, ‘S’, ‘T’七个字符中的一个,分别表示如下意思:   ‘#’: 任何时候玩...
  • qq_16234613
  • qq_16234613
  • 2017年08月23日 15:33
  • 130

ccf I’m stuck!

试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   给定一个R行C列的地图,地图的每一个方格可能是'#', '+',...
  • update7
  • update7
  • 2017年09月16日 20:43
  • 5266

CCF之I’m stuck!(java)

试题编号: 201312-5 试题名称: I’m stuck! 时间限制: 1.0s 内存限制: 256.0MB 问题描...
  • zjj582984208
  • zjj582984208
  • 2017年02月15日 15:43
  • 386

CCF 201312-5 I’m stuck!

问题描述   给定一个R行C列的地图,地图的每一个方格可能是'#', '+', '-', '|', '.', 'S', 'T'七个字符中的一个,分别表示如下意思:   '#': 任何时候玩家都不能移动...
  • Fencingworld
  • Fencingworld
  • 2016年12月07日 21:38
  • 176
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:I'm stuck! ccf模拟题。
举报原因:
原因补充:

(最多只允许输入30个字)