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;
}