A,收集制片
题意
在一个n*m的房间里有一个T张纸片,求收集这些纸片并走回去所需走的最短路程。输入描述
在第一行中给出一个
,
, 代表测试数据的组数。
对于每组输入,在第一行中给出房间大小,第二行给出你的初始位置。
接下来给出一个正整数,
代表纸片的个数。
接下来 n 行,每行一个坐标代表纸片的位置。
保证房间小于,纸片一定位于房间内。
输出描述
对于每组输入,在一行中输出答案。
格式参见样例。
解析
给你们看下我的多此亿举的代码吧,有比我这个做法好很多很多很多的代码,我的思路就是用bfs,bfs找到的路劲一定是最短路劲,只是我这个做法多一点暴力,没有剪枝,就是纯暴力从头暴力到尾,首先把起点加到队列里,搜到第一个点后清空队列,把第一个点加进去,并且清除走过的标记,然后继续搜,直到搜到第二点,再次这样做,直到最后一个点,然后再直接回到起点(周练的时候脑子不清晰,最后回去的时候也是直接bfs回去。。。。。可以直接起点减终点就好了)代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int mp[25][25];
int nx[4]={0,1,-1,0};
int ny[4]={1,0,0,-1};
bool vis[25][25];
struct node{
int x;
int y;
int step;
};
int mx,my;
int bfs(int sx,int sy,int T){
queue<node>q;
node k;
int flag=0;
k.x=sx;
k.y=sy;
k.step=0;
int key=0;
q.push(k);
int kstep=0;
while(!q.empty()){
node c=q.front();
q.pop();
if(mp[c.x][c.y]==1){
mp[c.x][c.y]=0;
key++;
kstep+=c.step;
memset(vis,0,sizeof(vis));
while (!q.empty()) q.pop();
c.step=0;
q.push(c);
}
vis[c.x][c.y]=1;
if(key==T){
memset(vis,0,sizeof(vis));
flag=1;
while (!q.empty()) q.pop();
c.step=0;
q.push(c);
key++;
}
if(flag){
if(c.x==sx&&c.y==sy)
return kstep+c.step;
}
for(int i=0;i<4;++i){
int tx=c.x+nx[i];
int ty=c.y+ny[i];
if(tx>0&&ty>0&&tx<=mx&&ty<=my&&vis[tx][ty]==0){
node xi=c;
xi.x=tx;
xi.y=ty;
xi.step++;
q.push(xi);
}
}
}
return -1;
}
int main(void){
int n;
cin>>n;
while(n--){
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
int sx,sy;
cin>>mx>>my;
cin>>sx>>sy;
int t;
cin>>t;
int T=t;
while(t--){
int a,b;
cin>>a>>b;
mp[a][b]=1;
}
cout<<"The shortest path has length "<<bfs(sx,sy,T)<<endl;
}
return 0;
}
E,数字比较
题意
输入两个数据x,y,比较$x^{y}$和$y^{x}$输入描述
两个数字x和y。
满足1 <= x,y <=
输出描述
一个字符,">","<"或者"="。
解析
高中数学,我们将$x^{y}$转换$xlog(y)$,然后进行比较就好了代码
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int x,y;
cin>>x>>y;
if(x*log(y)>y*log(x))
{
cout<<"<"<<endl;
}
else if(x*log(y)<y*log(x))
{
cout<<">"<<endl;
}
else cout<<"="<<endl;
return 0;
}
京公网安备 11010502036488号