#include<bits/stdc++.h>
using namespace std;
string S,T;
int n,m,co,ans;
int dx[4]={1,0,0,-1},dy[4]={0,-1,1,0};
char g[510][510];
struct node{
int x,y;
string op;
};
bool st[510][510];
char p[4]={'D','L','R','U'};
int main()
{
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>g[i][j];
st[i][j]=0;
}
queue<node> q;
q.push({0,0,""});
st[0][0]=1;
while(q.size())
{
auto t=q.front();
q.pop();
// cout<<t.x<<" "<<t.y<<" "<<t.op<<endl;
if(t.x==n-1 && t.y==m-1){
cout<<t.op.size()<<endl<<t.op;
break;
}
for(int i=0;i<4;i++)
{
int xx=t.x+dx[i],yy=t.y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=m||st[xx][yy]||g[xx][yy]=='1')
continue;
st[xx][yy]=1;
q.push({xx,yy,t.op+p[i]});
}
}
}
return 0;
}
56.矩阵中的最长递增路径
#include<bits/stdc++.h>
using namespace std;
int n,m,g[55][55],st[55][55];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int dfs(int i, int j)
{
if (st[i][j]) return st[i][j];
int maxlen = 1;
for (int p=0;p<4;p++)
{
int x = i + dx[p], y = j + dy[p];
if (x < 0 || x >= n || y < 0 || y >= m || g[x][y] <= g[i][j]) continue;
int len = 1 + dfs(x, y);
maxlen = max(maxlen, len);
}
st[i][j] = maxlen;
return maxlen;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>g[i][j];
int res = 1;
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
res = max(res,dfs(i,j));
}
}
cout<<res;
}
57.线段和点
#include<bits/stdc++.h>
using namespace std;
const int N =1e4+10;
int n,m,a[N];
struct node{
int l,r;
bool operator<(const node &p) const{
if(l!=p.l) return l<p.l;
return r>p.r;
}
}d[N];
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++) cin>>d[i].l>>d[i].r;
sort(d,d+m);
int i,cur=0;
for(i=0;i<n;i++)
{
int t=0;
for(int j=0;j<n;j++)
{
int k=cur;
while(k<m)
{
if(a[j]<d[k].l || d[k].r<a[j])
break;
k++;
}
if(k>t) t=k;
}
cur=t;
if(cur==m) break;
}
if(i==n) cout<<-1;
else cout<<i+1;
return 0;
}
58.矩阵翻转
59.无重叠区间
#include<bits/stdc++.h>
using namespace std;
const int N = 2e4+10;
int n;
struct node{
int l,r;
bool operator<(const node &p) const{
return r<p.r;
}
}a[N];
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i].l>>a[i].r;
sort(a,a+n);
int cnt=0,i=1,cur=a[0].r;
for(int i=1;i<n;i++)
{
if(a[i].l<cur) cnt++;
else cur=a[i].r;
}
cout<<cnt;
return 0;
}
60.超级玛丽
#include<bits/stdc++.h>
using namespace std;
const int N = 2e4+10;
int n,m,a[N],f,x;
set<int> se;
int main()
{
cin>>n>>m;
while(m--)
{
cin>>x;
a[x]=-1;
if(a[x-1]==-1 || a[x+1]==-1) f=1;
}
a[1]=1;
if(f) a[n]=0;
else{
for(int i=1;i<=n;i++)
{
if(a[i-1]!=-1 && a[i]!=-1) a[i]+=a[i-1];
if(a[i-2]!=-1 && a[i]!=-1) a[i]+=a[i-2];
}
}
cout<<a[n];
return 0;
}