I - 红与黑
Posted wgd943
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I - 红与黑相关的知识,希望对你有一定的参考价值。
【题意】仅有两种颜色,红,黑两种瓷砖,我现在只能在相邻黑瓷砖上运动,并且我现在站在黑色瓷砖上,问能够到达好多快瓷砖。输入 0 0 是退出。
【思路】此题是bfs搜索,因为,提到了只能向相邻的黑色瓷砖运动,所以只需要记录我自己可以在队列中push多少次即可,最终答案加1哦,因为要算本身的
【代码】:
#include<stdio.h> #include<iostream> #include<queue> #include<string.h> using namespace std; int W,H; char mp[21][21]; int vis[21][21]; int fx[4]={0,0,-1,1}; int fy[4]={-1,1,0,0}; struct node{ int x,y; }; int ans; int x,y; bool check(int x,int y){ //printf("%d %d==== ",x,y); if(x<H&&x>=0&&y<W&&y>=0){//不能超过边界 return 1; } else return 0; } int bfs(int x,int y){ queue<node> q; q.push({x,y}); while(q.size()){ node now=q.front(); q.pop(); for(int i=0;i<4;i++){ int nextx=now.x+fx[i]; int nexty=now.y+fy[i]; if(check(nextx,nexty)&&!vis[nextx][nexty]&&mp[nextx][nexty]==‘.‘){ ans++;//只管加就是 //printf("%d %d---%d %d++++ ",nextx,nexty,ans,check(nextx,nexty)); q.push({nextx,nexty}); vis[nextx][nexty]=1;//走过的点标记,不在走就是 } } } return ans; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); int si,sj;//记录我现在的位置 while(cin>>W>>H){ ans=0; memset(vis,0,sizeof(vis)); if(W==0&&H==0) break; for(int i=0;i<H;i++){ for(int j=0;j<W;j++){ cin>>mp[i][j]; if(mp[i][j]==‘@‘){ si=i; sj=j; } } } //printf("%d %d----- ",si,sj); //bfs(si,sj); cout<<bfs(si,sj)+1<<" "; } return 0; }
此题很bfs,自己觉得没有太大难度,只是最后加1可能会忽略。
okk....
以上是关于I - 红与黑的主要内容,如果未能解决你的问题,请参考以下文章