【洛谷P1135】奇怪的电梯
与课程一致
#include <bits/stdc++.h>
using namespace std;
int n,a,b;
int k[300],flag[300]={0};//flag 1已出现 0未出现
struct t{int step,num;
};
void bfs();
int main() {
cin>>n>>a>>b;
for(int i=1;i<=n;i++)
cin>>k[i];
bfs();
return 0;
}
void bfs(){
t cur,next;
cur.num=a;
cur.step=0;
queue <t>q;
q.push(cur);
while(q.empty()==0){
cur=q.front();
q.pop();
if(cur.num==b){
cout<<cur.step;
return;
}
next.num=cur.num+k[cur.num];
next.step=cur.step+1;
if(next.num<=b&&flag[next.num]==0){
q.push(next);
flag[next.num]=1;
}
next.num=cur.num-k[cur.num];
next.step=cur.step+1;
if(next.num>0&&flag[next.num]==0){
q.push(next);
flag[next.num]=1;
}
}
cout<<"-1";
}
【洛谷P1443】马的遍历
最开始超时,改了改反而显示洛谷编译有问题了,于是放上超时版本。
#include <bits/stdc++.h>
using namespace std;
int n,m,a,b;
struct t{int step,x,y;
};
void bfs(int i,int j);
int main() {
cin>>n>>m>>a>>b;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
bfs(i,j);
cout<<' ';
}
cout<<endl;
}
return 0;
}
void bfs(int i,int j){
int flag[500][500]={0};//flag 1已出现 0未出现
t cur,next;
queue<t>q;
cur.step=0;
cur.x=a;
cur.y=b;
q.push(cur);
while(!q.empty()){
cur=q.front() ;
//cout<<"//"<<cur.x<<' '<<cur.y<<' '<<cur.step<<endl;
q.pop();
if(cur.x==i&&cur.y==j){
cout<<cur.step;
return;
}
next.step=cur.step+1;
//左上 日
next.x=cur.x-1;
next.y=cur.y+2;
if(next.x>0&&next.y<=m&&flag[next.x][next.y]==0){
q.push(next);
flag[next.x][next.y]=1;
}
//左上 口口
next.x=cur.x-2;
next.y=cur.y+1;
if(next.x>0&&next.y<=m&&flag[next.x][next.y]==0){
q.push(next);
flag[next.x][next.y]=1;
}
//右上 日
next.x=cur.x+1;
next.y=cur.y+2;
if(next.x<=n&&next.y<=m&&flag[next.x][next.y]==0){
q.push(next);
flag[next.x][next.y]=1;
}
//右上 口口
next.x=cur.x+2;
next.y=cur.y+1;
if(next.x<=n&&next.y<=m&&flag[next.x][next.y]==0){
q.push(next);
flag[next.x][next.y]=1;
}
//左下 日
next.x=cur.x-1;
next.y=cur.y-2;
if(next.x>0&&next.y>0&&flag[next.x][next.y]==0){
q.push(next);
flag[next.x][next.y]=1;
}
//左下 口口
next.x=cur.x-2;
next.y=cur.y-1;
if(next.x>0&&next.y>0&&flag[next.x][next.y]==0){
q.push(next);
flag[next.x][next.y]=1;
}
//右下 日
next.x=cur.x+1;
next.y=cur.y-2;
if(next.x<=n&&next.y>0&&flag[next.x][next.y]==0){
q.push(next);
flag[next.x][next.y]=1;
}
//右下 口口
next.x=cur.x+2;
next.y=cur.y-1;
if(next.x<=n&&next.y>0&&flag[next.x][next.y]==0){
q.push(next);
flag[next.x][next.y]=1;
}
}
cout<<"-1";
}
【洛谷P3958】奶酪
需要特判一下球与球相交相切,以及球与底面相交相切
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll h,r;
int n;
struct po{ll x,y,z;
}a[1010];
void bfs();
bool c(po a,po b){
if(a.z==0)//只可能a[0].z为0
return b.z<=r;
return 4*r*r>=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
}
int main() {
int t;
cin>>t;
for(int i=0;i<t;i++){
a[0].z=0;
cin>>n>>h>>r;
for(int j=1;j<=n;j++)
cin>>a[j].x>>a[j].y>>a[j].z;
bfs();
}
return 0;
}
void bfs(){
int cur,flag[1010]={0};//flag 1已出现 0未出现
queue <int>q;
q.push(0);
while(q.empty()==0){
cur=q.front();
q.pop();
if(flag[cur]==1)
continue;
flag[cur]=1;
if(a[cur].z+r>=h){
cout<<"Yes"<<endl;
return;
}
for(int i=1;i<=n;i++){//查找所有相交相切
if(i!=cur&&c(a[cur],a[i])){
q.push(i);
}
}
}
cout<<"No"<<endl;
}
【洛谷P1162】填涂颜色
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int a[40][40],n;
int dx[5]={0,0,1,-1},dy[5]={1,-1,0,0};
struct po{int x,y;
};
void bfs(int i,int j);
int main() {
cin>>n;
int tem=1;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cin>>a[i][j];
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]==1){
tem=0;
bfs(i,j);
break;
}
}
if(tem==0)
break;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
void bfs(int i,int j){
po cur,ne;
int flag[40][40]={0};//flag 1已出现 0未出现
cur.x=i+1;cur.y=j+1;
a[i+1][j+1]=2;
queue <po>q;
q.push(cur);
while(!q.empty()){
cur=q.front();
q.pop();
for(int k=0;k<4;k++){
ne.x=cur.x+dx[k];
ne.y=cur.y+dy[k];
if(a[ne.x][ne.y]==0){
q.push(ne);
a[ne.x][ne.y]=2;
}
}
}
return;
}