J. Torn To Pieces
思路很简单,主要是怎么实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const double PI= acos(-1.0);
const int M = 100+7;
/*
int head[M],cnt;
void init(){cnt=0,memset(head,-1,sizeof(head));}
struct EDGE{int to,nxt,val;}ee[M*2];
void add(int x,int y){ee[++cnt].nxt=head[x],ee[cnt].to=y,head[x]=cnt;}
*/
vector<int>G[M];
map<string,map<string,int> >mp;
map<string,int>id;
map<int,string>di;
vector<int>p;
string st,ed;
int vs[M];
bool f;
void dfs(int u,int fa)
{
vs[u]=1;
if(u==id[ed])
{
if(p.size()==0)return ;
for(int i=0;i<p.size();i++)
cout<<di[p[i]]<<" ";
cout<<endl;
f=true;
return ;
}
for(auto v:G[u])
{
if(v==fa||vs[v])continue;
p.pb(v);
dfs(v,u);
p.pop_back();
}
}
char S[1100];
int main()
{
int n,sz=0;
// freopen("test_15.in","r",stdin);
cin>>n;
getchar();
for(int i=1;i<=n;i++)
{
int nm=1;
cin.getline(S,1000);
int l=strlen(S);
string s[40];
for(int j=0;j<l;j++)
{
if(S[j]==' ')
{
if(id.find(s[nm])==id.end())id[s[nm]]=++sz;
di[id[s[nm]]]=s[nm];
++nm;
}
else
s[nm]+=S[j];
}
if(id.find(s[nm])==id.end())id[s[nm]]=++sz;
di[id[s[nm]]]=s[nm];
for(int j=2;j<=nm;j++)
{
int u=id[s[j]];
int v=id[s[1]];
G[u].pb(v);
G[v].pb(u);
}
}
cin>>st>>ed;
p.pb(id[st]);
if(id[st])dfs(id[st],-1);
if(!f)
cout<<"no route found"<<endl;
return 0;
}
模拟+暴力就完事了 注意特判
#include <cstdio>
#include<cstring>
using namespace std;
typedef unsigned long long ll;
const int M = 110+7;
char s[M];
char pr[40]={"0123456789abcdefghijklmnopqrstuvwxyz0"};
ll a[3][40];
int gt(char ch)
{
if(ch<='9'&&ch>='0')return ch-'0';
return ch-'a'+10;
}
int main()
{
int t;
scanf("%d",&t);
ll up=1;for(int i=1;i<=32;i++)up*=2;up--;
while(t--)
{
scanf(" %[^\n]",s);
int l=strlen(s);
int tp=0;char op;
memset(a,0,sizeof(a));
for(int i=0;i<l;i++)
{
if(s[i]==' ')
{
if(tp==0)op=s[i+1];
tp++;i+=2;
continue;
}
for(int j=1;j<=36;j++)
{
if(a[tp][j]==-1)continue;
a[tp][j]*=j;
ll z=gt(s[i]);
a[tp][j]+=z;
if(a[tp][j]>up||z>j||z==j&&j!=1||z==0&&j==1)a[tp][j]=-1;
}
}
int nm=0;
for(int i=1;i<=36;i++)
{
bool f=true;
for(int j=0;j<=2;j++)
{
if(a[j][i]==-1)
f=false;
}
// printf("%d %lld %lld %lld\n",i,a[0][i],a[1][i],a[2][i]);
if(!f)continue;
ll w;
if(op=='+'&&a[0][i]+a[1][i]==a[2][i]);
else if(op=='-'&&a[0][i]-a[1][i]==a[2][i]);
else if(op=='*'&&a[0][i]*a[1][i]==a[2][i]);
else if(op=='/'&&a[2][i]*a[1][i]==a[0][i]);
else f=false;
if(f)printf("%c",pr[i]),nm++;
}
if(nm==0)printf("invalid");
puts("");
}
return 0;
}