C++ 實(shí)現(xiàn)球迷 今日頭條面試題
試題描述:
一個(gè)球場(chǎng)C的球迷看臺(tái)可容納M*N個(gè)球迷。官方想統(tǒng)計(jì)一共有多少球迷群體,最大的球迷群體有多少人。
球迷選座特性:同球迷群體會(huì)選擇相鄰座位,不同球迷群體選擇不相鄰的座位。(相鄰包括前后相鄰、左右相鄰、斜對(duì)角相鄰);
給定一個(gè)M*N的二維球場(chǎng),0代表該位置沒(méi)人,1代表該位置有人,希望輸出球隊(duì)群體個(gè)數(shù)P,最大的球隊(duì)群體人數(shù)Q。
輸入:
第一行,2個(gè)數(shù)字,M、N,使用英文逗號(hào)隔開(kāi)。
接下來(lái)M行,每行N個(gè)數(shù)字,使用英文逗號(hào)隔開(kāi)。
輸出:
一行,2數(shù)字,P和Q。
輸入樣例:
10,10
0,0,0,0,0,0,0,0,0,0
0,0,0,1,1,0,1,0,0,0
0,1,0,0,0,0,0,1,0,1
1,0,0,0,0,0,0,0,1,1
0,0,0,1,1,1,0,0,0,1
0,0,0,0,0,0,1,0,1,1
0,1,1,0,0,0,0,0,0,0
0,0,0,1,0,1,0,0,0,0
0,0,1,0,0,1,0,0,0,0
0,1,0,0,0,0,0,0,0,0
輸出樣例:
6,8
其他:
對(duì)于100%的數(shù)據(jù),1<=M,N<=3e3。
這道題是一道明顯的深度優(yōu)先搜索,而且十分簡(jiǎn)單。
但是在看到輸入示例后會(huì)發(fā)現(xiàn)每個(gè)數(shù)據(jù)的后面都存在著一個(gè)字符,而且回車(chē)也屬于字符。
所以我們要先對(duì)數(shù)據(jù)進(jìn)行處理。
我們需要使用的的輔助工具就是getchar()了,不知道的人可以把getchar()作為一個(gè)爪子,每當(dāng)一個(gè)char類(lèi)型的字符被輸入后,getchar()就可以準(zhǔn)確的捕捉到他。
但是getchar()是會(huì)忽略每行第一個(gè)字符的。
所以我們可以定義一個(gè)數(shù)組,在取完第一個(gè)數(shù)后再使用getchar()。就可以把所有的0和1存儲(chǔ)在一個(gè)n*m的二維數(shù)組中了。
再說(shuō)dfs,就十分簡(jiǎn)單了,只需要判斷可能走的8個(gè)方向,再使用一個(gè)計(jì)數(shù)器計(jì)數(shù)就可以了。
但是為了避免走重復(fù)的路,也是為了避免時(shí)間超限。所以我們可以定義一個(gè)bool類(lèi)型的數(shù)組,記錄走過(guò)的路。
同時(shí)在主函數(shù)中做寫(xiě)一個(gè)兩層的嵌套循環(huán),找到每個(gè)1,再進(jìn)行dfs。
也要注意使用scanf和printf。
在最后也需要使用一個(gè)putchar(),相當(dāng)于是輸出一個(gè)字符。
論速度那個(gè)快 putchar(),getchar>scanf,printf>cin,cout。
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<stdio.h> using namespace std; int n,m,l,k,sum,ans,cnt; char a[4000][4000],op; bool b[4000][4000]={0}; int dfs(int x,int y) { if(a[x-1][y]=='1'&&b[x-1][y]==0) { b[x-1][y]=1; dfs(x-1,y); ans++; } if(a[x][y+1]=='1'&&b[x][y+1]==0) { b[x][y+1]=1; dfs(x,y+1); ans++; } if(a[x-1][y+1]=='1'&&b[x-1][y+1]==0) { b[x-1][y+1]=1; dfs(x-1,y+1); ans++; } if(a[x+1][y]=='1'&&b[x+1][y]==0) { b[x+1][y]=1; dfs(x+1,y); ans++; } if(a[x][y-1]=='1'&&b[x][y-1]==0) { b[x][y-1]=1; dfs(x,y-1); ans++; } if(a[x+1][y-1]=='1'&&b[x+1][y-1]==0) { b[x+1][y-1]=1; dfs(x+1,y-1); ans++; } if(a[x+1][y+1]=='1'&&b[x+1][y+1]==0) { b[x+1][y+1]=1; dfs(x+1,y+1); ans++; } if(a[x-1][y-1]=='1'&&b[x-1][y-1]==0) { b[x-1][y-1]=1; dfs(x-1,y-1); ans++; } return ans; } int main() { scanf("%d%c%d",&n,&op,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { getchar(); a[i][j]=getchar(); } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { ans=0; if(a[i][j]=='0')b[i][j]=1; if(a[i][j]=='1'&&b[i][j]==0) { sum++; cnt=max(cnt,dfs(i,j)); } } } char p=','; printf("%d",sum); putchar(p); printf("%d",cnt); }
總結(jié)
以上所述是小編給大家介紹的C++ 實(shí)現(xiàn)球迷 今日頭條面試題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- C++實(shí)現(xiàn)產(chǎn)生隨機(jī)數(shù)和相應(yīng)的猜拳小游戲?qū)嵗a
- C++數(shù)字三角形問(wèn)題與dp算法
- Visual Studio Code配置C、C++環(huán)境并編寫(xiě)運(yùn)行的方法
- c++使用正則表達(dá)式提取關(guān)鍵字的方法
- 詳解C++ 動(dòng)態(tài)內(nèi)存分配與命名空間
- 淺析Java、C/C++、JavaScript、PHP、Python分別用來(lái)開(kāi)發(fā)什么?
- 解決C++全局變量只能初始化不能賦值的問(wèn)題
- C++模擬鍵盤(pán)按鍵的實(shí)例
- C++使用異或運(yùn)算實(shí)現(xiàn)交換兩個(gè)數(shù)的值
相關(guān)文章
C++可擴(kuò)展性與多線(xiàn)程超詳細(xì)精講
這篇文章主要介紹了C++可擴(kuò)展性與多線(xiàn)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10Opencv實(shí)現(xiàn)圖像灰度線(xiàn)性變換
這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)圖像灰度線(xiàn)性變換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05C++實(shí)現(xiàn)一維向量旋轉(zhuǎn)算法
這篇文章主要介紹了C++實(shí)現(xiàn)一維向量旋轉(zhuǎn)算法,非常實(shí)用的經(jīng)典算法,需要的朋友可以參考下2014-08-08C語(yǔ)言簡(jiǎn)易通訊錄的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言簡(jiǎn)易通訊錄的實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11解決codeblocks斷點(diǎn)不停無(wú)效的問(wèn)題
今天小編就為大家分享一篇解決codeblocks斷點(diǎn)不停無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12