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 ...

I'm stuck! ccf 2013年12月第5题

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

ccf—I'm stuck!

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

ccf考试模拟题

  • 2015年10月04日 17:10
  • 333KB
  • 下载

CCF模拟题——有趣的数详解

马上就要参加CCF认证考试了,然后最近就在做CCF上的模拟题,我选的语言是java,然后遇到第四题——有趣的数,当时一看题目,卧槽太TM简单了,比第一题和第二题还简单,高兴死我了,然后我就做呗,然后我...

CCF 模拟题 有趣的数 (数位DP)

问题描述   我们把一个数称为有趣的,当且仅当:   1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。   2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3...

CCF认证模拟题——学生排队

问题描述   体育老师小明要将自己班上的学生按顺序排队。他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整。一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再...

CCF模拟题部分题目解题思路与AC代码

博主弱渣,网络上题解较少,因此将部分代码和思路写下来方便查阅,大牛们路过就好orz 还不是因为太简单才没有大牛写题解的嘛orz...

CCF认证模拟题——分蛋糕

问题描述   小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,...

CCF模拟题-1~5

报名第九次CCF认证,是为了能参加第二届的CCSP,做了一下题库里的C\C++模拟,发现真是够水了……前三题,过于简单,不再赘述,发一下题目和对应答案~~~出现次数最多的数#include #inc...
  • f_zyj
  • f_zyj
  • 2016年12月15日 11:52
  • 301
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:I'm stuck! ccf模拟题。
举报原因:
原因补充:

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