1215 走迷宫
#include<cstdio> #include<cstring> int m,n,ans=0; char g[20][20],v[20][20]; void dfs(int i,int j){ if(v[i][j]||ans||g[i][j]=='#'||!g[i][j])return ;//字符边界 if(g[i][j]=='e'){ans=1;return ;} v[i][j]=1; dfs(i-1,j); dfs(i+1,j); dfs(i,j-1); dfs(i,j+1); } int main(){ scanf("%d",&m); while(m--){ scanf("%d",&n); ans=0; memset(g,'#',sizeof(g)); memset(v,0,sizeof(v)); for(int i=1;i<=n;i++) scanf("%s",g[i]+1); dfs(1,1); printf("%s\n",((ans==1)?"YES":"NO")); } return 0; } /*简单的深度搜索*/
3286 火柴排队
#include<cstdio> #include<algorithm> #define maxn 100010 using namespace std; int a[maxn],b[maxn],aa[maxn],bb[maxn],pos[maxn],cnt; void meg(int* a,int*t,int l,int r,int&cnt){ if(l+1==r)return; int m=l+(r-l)/2,i=l,j=m,ap=l; meg(a,t,l,m,cnt);meg(a,t,m,r,cnt); while(i<m||j<r){ if(j>=r||(i<m&&a[i]<=a[j]))t[ap++]=a[i++]; else {t[ap++]=a[j++];cnt=((cnt+m-i)%99999997);} } for(i=l;i<r;i++)a[i]=t[i]; } int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",a+i); aa[i]=a[i]; } for(int i=0;i<n;i++){ scanf("%d",b+i); bb[i]=b[i]; } meg(aa,pos,0,n,cnt); meg(bb,pos,0,n,cnt); for(int i=0;i<n;i++){//离散化连续 a[i]=lower_bound(aa,aa+n,a[i])-aa; b[i]=lower_bound(bb,bb+n,b[i])-bb; pos[a[i]]=i; } for(int i=0;i<n;i++)b[i]=pos[b[i]]; cnt=0; meg(b,aa,0,n,cnt); printf("%d\n",cnt); return 0; } /* 数组重用有点乱.... 首先贪心:a里面第k大的和b的第k大的要在同一下标 然后离散:把a[i]改成它的排行值(先排个序,再找它在第几位); 接着保存a[i]的初始位置,存在pos[i];(从初始乱序到正确位置 和 从正确位置到乱序位置对称!) 然后就是把b[i]的初始位置找出来(此时a,b已经连续化) 最后只需要把位置的逆序对求出来就ok了 一道有意思的构造序列 */
2618 核电站问题
#include<cstdio> #include<cmath> long long a[55]; int main(){ int n,m; scanf("%d%d",&n,&m); a[m]=1; for(int i=m+1;i<=n;i++) a[i]=2*a[i-1]+pow(2,i-m-1)-a[i-m-1]; printf("%lld\n",(long long)pow(2,n)-a[n]); return 0; } /* 等水题刷完了将无题可刷 */