P4924
魔法少女的旋转,关于顺时针逆时针旋转,我发现的规律是,建立类似坐标轴的东西,然后相对于旋转原点,前后变幻的点的坐标之间是有联系的
void bianhua(int i)
{
for(int xx=x[i]-r[i];xx<=x[i]+r[i];xx++)
{
for(int yy=y[i]-r[i];yy<=y[i]+r[i];yy++)
{
if(!fx[i])
b[x[i]+yy-y[i]][y[i]-xx+x[i]]=a[xx][yy];
else
b[x[i]+y[i]-yy][y[i]+xx-x[i]]=a[xx][yy];
}
}
for(int xx=x[i]-r[i];xx<=x[i]+r[i];xx++)
{
for(int yy=y[i]-r[i];yy<=y[i]+r[i];yy++)
{
a[xx][yy]=b[xx][yy];
}
}
}
感觉其他大佬也是这种想法,写的可能还没有我的好理解
P1518
抓住他们两个人时间相同,所以终止条件是两个人走到相同的位置上去,利用xx,yy切换方向,但这里是可能换方向,可能不换方向的,不换方向时,其实就是fx+xx[ff],里面的ff不变,换方向就是ff=(ff+1)%4,这是在一个永无止尽直到自己break的循环里面,还有就是不能走回走过的地方,当然可以用vis数组,或者是设置标志量,这样一个一维的数组就可以了
#include<iostream>
using namespace std;
int xx[]={-1,0,1,0};
int yy[]={0,1,0,-1};
char a[12][12];
long long int zt[19900000]={0},nx,ny,fx,fy,ff,cf,nt,t;
int main()
{
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
cin>>a[i][j];
if(a[i][j]=='C')
{
nx=i;
ny=j;
}
if(a[i][j]=='F')
{
fx=i;
fy=j;
}
}
}
while(1)
{
if(nx==fx&&ny==fy)
{
cout<<t;
return 0;
}
nt=fx+fy*10+nx*100+ny*1000+ff*10000+cf*40000;
if(zt[nt])
{
cout<<0;
return 0;
}
zt[nt]=1;
if(fx+xx[ff]<0||fx+xx[ff]>=10||fy+yy[ff]<0||fy+yy[ff]>=10||a[fx+xx[ff]][fy+yy[ff]]=='*')
ff=(ff+1)%4;
else
{fx=fx+xx[ff];fy=fy+yy[ff];
}
if(nx+xx[cf]<0||nx+xx[cf]>=10||ny+yy[cf]<0||ny+yy[cf]>=10||a[nx+xx[cf]][ny+yy[cf]]=='*')
cf=(cf+1)%4;
else
{nx=nx+xx[cf];ny=ny+yy[cf];
}
t++;
}
return 0;
}
P1067
这种题目就是模拟吧,分类主要是头尾,符号,0的问题
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n,a;
cin>>n;
for(int i=n;i>=0;i--)
{
cin>>a;
if(a)
{
if(i!=n&&a>0) cout<<"+";
if(abs(a)>1||i==0)cout<<a;
if(a==-1&&i)cout<<"-";
if(i>1)cout<<"x^"<<i;
if(i==1)cout<<"x";
}
}
}