好勒,来一波纯bfs题,我只写写代码和queue的思路哦。
1359:这是一道“水淹法”题,采用从边上进行搜索,能到的地方,都是被“淹”的。
最后统计一下没被淹的就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
bool b[105][105];
int tot,dx[4]= {0,1,0,-1},dy[4]= {1,0,-1,0}; //四方向
char c;
struct qq
{
int xn,yn;
} w,wn;
void bfs(int x,int y)
{
queue<qq> q;
w.xn=x;
w.yn=y;
q.push(w);//推入起始点
b[x][y]=false;
while(!q.empty()) //当队列非空
{
w=q.front();
q.pop();
for(int i=0; i<4; i++)
{
wn.xn=w.xn+dx[i];
wn.yn=w.yn+dy[i];
if(wn.xn>0&&wn.xn<=10&&wn.yn>0&&wn.yn<=10&&b[wn.xn][wn.yn])
{
b[wn.xn][wn.yn]=false;
q.push(wn);
}
}
}
}
int main()
{
for(int i=1; i<=10; i++)
for(int j=1; j<=10; j++)
{
cin>>c;
if(c=='0') b[i][j]=true;
}
//判断
for(int i=1; i<=10; i++)
{
//水淹法
if(b[1][i]) bfs(1,i);//第一行
if(b[10][i]) bfs(10,i);//最后一行
if(b[i][1]) bfs(i,1);//第一列
if(b[i][10]) bfs(i,10);//最后一列
}
for(int i=1; i<=10; i++)
for(int j=1; j<=10; j++)
if(b[i][j]) tot++;
//统计
cout<<tot<<endl;
return 0;
}
还行吧。
1360:简单的,bfs可能的楼层就行了。注意:不要上过n层,不要掉到-1层。
代码:
#include <bits/stdc++.h>
using namespace std;
int n,a,b,f[250];
struct qq
{
int st,num;
} w,w1;//step-步数,number-数字
bool bb[250];
void bfs()
{
queue<qq> q;//队列
w.num=1;
w.st=0;
bb[a]=true;
q.push(w);//入队第一个
while(!q.empty())
{
w1=q.front();
q.pop();
int up=w1.num+f[w1.num],down=w1.num-f[w1.num];//上去的楼层、下来的楼层。
if(up>0&&up<=n&&!bb[up])
{//如果电梯正常(或没有飞天、掉地),且楼层没到过
if(up==b)
{
cout<<w1.st+1<<endl;
return;
}//如果到了,输出、退出
w.num=up;
w.st=w1.st+1;
bb[up]=true;
q.push(w);//不然记录并入栈
}
if(down>0&&down<=n&&!bb[down])
{
if(down==b)
{
cout<<w1.st+1<<endl;
return;
}
w.num=down;
w.st=w1.st+1;
bb[down]=true;
q.push(w);
}//同类于up
//其实上行时没必要担忧掉下去,下行时没必要担忧飞上去,但我还是写了,呵呵
}
cout<<-1<<endl;//别忘了哈
}
int main()
{
cin>>n>>a>>b;
if(a==b)
{
cout<<0<<endl;
return 0;
}//别忘了加这一句
for(int i=1; i<=n; i++) cin>>f[i];//输入
bfs();
return 0;
}
有两个注意点
一、别忘了输出-1;
二、如果在同一层,用0次就行了,别忘了哈。
好勒,其他啥事没有。
今天就到这,不难,明天再见。