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