日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

I'm stuck! ccf模拟题。

發(fā)布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I'm stuck! ccf模拟题。 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ccf模擬題。

?

I’m stuck!

時間限制:1.0s
內(nèi)存限制:256.0MB

?

問題描述

給定一個R行C列的地圖,地圖的每一個方格可能是'#',?'+',?'-',?'|',?'.',?'S',?'T'七個字符中的一個,分別表示如下意思:

?

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

'+': 當(dāng)玩家到達(dá)這一方格后,下一步可以向上下左右四個方向相鄰的任意一個非'#'方格移動一格;

'-': 當(dāng)玩家到達(dá)這一方格后,下一步可以向左右兩個方向相鄰的一個非'#'方格移動一格;

'|': 當(dāng)玩家到達(dá)這一方格后,下一步可以向上下兩個方向相鄰的一個非'#'方格移動一格;

'.': 當(dāng)玩家到達(dá)這一方格后,下一步只能向下移動一格。如果下面相鄰的方格為'#',則玩家不能再移動;

'S': 玩家的初始位置,地圖中只會有一個初始位置。玩家到達(dá)這一方格后,下一步可以向上下左右四個方向相鄰的任意一個非'#'方格移動一格;

'T': 玩家的目標(biāo)位置,地圖中只會有一個目標(biāo)位置。玩家到達(dá)這一方格后,可以選擇完成任務(wù),也可以選擇不完成任務(wù)繼續(xù)移動。如果繼續(xù)移動下一步可以向上下左右四個方向相鄰的任意一個非'#'方格移動一格。

此外,玩家不能移動出地圖。

請找出滿足下面兩個性質(zhì)的方格個數(shù):

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

2. 玩家可以從此方格移動到目標(biāo)位置。

輸入格式

輸入的第一行包括兩個整數(shù)R 和C,分別表示地圖的行和列數(shù)。(1 ≤ R, C ≤ 50)。

接下來的R行每行都包含C個字符。它們表示地圖的格子。地圖上恰好有一個'S'和一個'T'。

輸出格式

如果玩家在初始位置就已經(jīng)不能到達(dá)終點了,就輸出“I'm stuck!”(不含雙引號)。否則的話,輸出滿足性質(zhì)的方格的個數(shù)。

樣例輸入

5 5

--+-+

..|#.

..|##

S-+-T

####.

樣例輸出

2

樣例說明

如果把滿足性質(zhì)的方格在地圖上用'X'標(biāo)記出來的話,地圖如下所示:

--+-+

..|#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);elseprintf("I'm stuck!");
}

?

?

####X

一開始少了一個vis[dx][dy]=1;30分后來改過來了90分然后才發(fā)現(xiàn)我沒判斷I’m stuck!的條件所幸很簡單我又加上了。我覺得我的代碼比網(wǎng)上大多數(shù)都好理解吧。雖然有點長。

?

說一下思路吧,一開始時判斷能從S到達(dá)的點,并把這些點做標(biāo)記。就是can數(shù)組。后來在從被標(biāo)記的點出發(fā),看他能不能到T點,能的話counter加一。最后再用標(biāo)記的點個數(shù)的總數(shù)減去那些能到T的點。i'm stuck的條件也很好判斷,當(dāng)我再給那些點做標(biāo)記的時候如果T點沒標(biāo)記的話證明從s出發(fā)不能到T;

總結(jié)

以上是生活随笔為你收集整理的I'm stuck! ccf模拟题。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。