目录
1.未来之迷
思路
代码展示
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
getchar();
int i,b=0,a[100005]={0};
while((a[b]=getchar())!='\n')
b+=1;
printf("1");
a[0]++;
for(i=1;i<b;i++)
{
if(a[i-1]=='2')
{
if(a[i]=='1')
printf("0");
else{
printf("1");
a[i]++;
}
}
else if(a[i-1]=='1')
{
if(a[i]=='1')
{
a[i]++;
printf("1");
}
else
printf("0");
}
else
{
printf("1");
a[i]++;
}
}printf("\n");
}
return 0;
}
2.不要分心
思路
判断字符串是否重复出现,不必多说
代码展示
#include <stdio.h>
#include <string.h>
int main()
{
char a[1001];
int b[1001] = {0};
int n, i, j, k, len;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &len);
scanf("%s", a);
for (j = 0; j < len; j++) {
if (a[j] != a[j - 1]) {
for (k = 0; k < j; k++) {
if (a[k] == a[j]) {
b[i] = 1;
break;
}
}
}
if (b[i] == 1)
break;
}
}
for (i = 0; i < n; i++) {
if (b[i] == 0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
3.过河卒
思路
把马和马能到的地方标记,然后按顺序对坐标进行更新,a[x,y]=a[x-1,y]+a[x,y-1],最后输出a[x,y]的值。
代码展示
#include<stdio.h>
int main()
{
int x1,x2,y1,y2;
long long int a[30][30];
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
//所有不能通过的位置
a[x2][y2]=-1;
if(y2-2>=0 && x2+1<=x1)
a[x2+1][y2-2]=-1;
if(y2-2>=0 && x2-1>=0)
a[x2-1][y2-2]=-1;
if(y2-1>=0 && x2+2<=x1)
a[x2+2][y2-1]=-1;
if(y2-1>=0 && x2-2>=0)
a[x2-2][y2-1]=-1;
if(y2+1<=y1 && x2+2<=x1)
a[x2+2][y2+1]=-1;
if(y2+1<=y1 && x2-2>=0)
a[x2-2][y2+1]=-1;
if(y2+2<=y1 && x2+1<=x1)
a[x2+1][y2+2]=-1;
if(y2+2<=y1 && x2-1>=0)
a[x2-1][y2+2]=-1;
for(int i=1;i<=x1;i++)
{
if(a[0][i]==-1)
{
for(int j=i+1;j<=y1;j++)
{
if(a[0][j]!=-1)
a[0][j]=0;
}
break;
}else{
a[0][i]=1;
}
}
for(int i=1;i<=y1;i++)
{
if(a[i][0]==-1)
{
for(int j=i+1;j<=x1;j++)
{
if(a[j][0]!=-1)
a[j][0]=0;
}
break;
}else{
a[i][0]=1;
}
}
for(int i=1;i<=x1;i++)
for(int j=1;j<=y1;j++)
{
if(a[i][j]!=-1)
{
if(a[i-1][j]==-1&&a[i][j-1]==-1){
a[i][j]=0;
}else if(a[i-1][j]==-1&&a[i][j-1]!=-1){
a[i][j]=a[i][j-1];
}else if(a[i-1][j]!=-1&&a[i][j-1]==-1){
a[i][j]=a[i-1][j];
}else if(a[i-1][j]!=-1&&a[i][j-1]!=-1){
a[i][j]=a[i][j-1]+a[i-1][j];
}
}
}
printf("%lld\n",a[x1][y1]);
return 0;
}
#include<stdio.h>
long long dp[30][30];
int main()
{
int n,m,a,b,i,j;
scanf("%d%d%d%d",&a,&b,&n,&m);
m++;n++;a++;b++;
for(i=1;i<=a;i++)
for(j=1;j<=b;j++)
{
if(i==1 && j==1)
dp[i][j] = 1;
else if((i==n&&j==m) || (i==n-1&&j==m-2) || (i==n-2&&j==m-1) || (i==n-2&&j==m+1) || (i==n-1&&j==m+2) || (i==n+1&&j==m+2) || (i==n+2&&j==m+1) || (i==n+2&&j==m-1) || (i==n+1&&j==m-2))
dp[i][j]=0;
else if(i!=1 || j!=1)
dp[i][j] = dp[i-1][j]+dp[i][j-1];
}
printf("%lld\n",dp[a][b]);
return 0;
}
4.地毯
思路
1.三个循环暴力破解,在覆盖的地方+1
2.先二维差分再二维前缀和
代码展示
三个循环暴力破解(不出意外会超时)
#include <stdio.h>
int a[1001][1001] = {0};
int main() {
int x1, y1, x2, y2;
int n, m;
scanf("%d %d", &n, &m);
for (int i=1;i<=m;i++) {
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(int j=x1;j<=x2;j++)
for(int k=y1;k<=y2;k++)
{
a[j][k]++;
}
}
for (int i=1;i<=n;i++) {
for (int j=1;j<=n;j++) {
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
前缀和
#include<stdio.h>
int a[1005][1005]={0};
int main()
{
int n,m,x1,x2,y1,y2;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(int j=x1;j<=x2;j++)
{
a[j][y1]+=1;
a[j][y2+1]-=1;
}
}
for(int i=1;i<=n;i++)//每一行
{
for(int j=1;j<=n;j++)//每一列
{
a[i][j]+=a[i][j-1];//前缀和
}
}
//输出操作
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
-printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
5.最小新整数
思路
注意:要删除掉越靠前并且大于等于它后面的那个数
要删去前者比后者大的数,而不是删去最大的数,例如1329 1 那132肯定是要比129大的,如果数字已经是从小到大的了,那就从后往前删直到删除k位为止
代码展示
#include <stdio.h>
#include <string.h>
int main()
{
char n[50];
int t,k,len,flag=1;
scanf("%d",&t);
while(t--){
scanf("%s %d",n,&k);
len=strlen(n);
for(int i=0;i<k;i++){
for(int j=0;j<len-1;j++){
if(n[j]>n[j+1]){
for(int l=j;l<len-1;l++){//往前移,覆盖掉大的个,相当于删除
n[l]=n[l+1];
}
break;
}
}
len--;//长度每次减1,如果从小到大了,直接删除最后一位
}
for(int i=0;i<len;i++){
printf("%c",n[i]);
}
printf("\n");
}
}
6.宇航员
思路
代码展示
#include<stdio.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
char s[10];
int a;
int x=0,y=0,z=0;
int lian=0,zuo=4,tou=2;//原来的方向
int t;
for(int i=0;i<n;i++)
{
scanf("%s%d",s,&a);
if(s[0]=='l')
{
t=lian;
lian=zuo;
zuo=(t+3)%6;
}
else if(s[0]=='r')
{
t=zuo;
zuo=lian;
lian=(t+3)%6;
}
else if(s[0]=='u')
{
t=lian;
lian=tou;
tou=(t+3)%6;
}
else if(s[0]=='d')
{
t=tou;
tou=lian;
lian=(t+3)%6;
}
else if(s[0]=='b')
{
zuo=(zuo+3)%6;
lian=(lian+3)%6;
}
if(lian==0)
{
x+=a;
}
else if(lian==1)
{
y+=a;
}
else if(lian==2)
{
z+=a;
}
else if(lian==3)
{
x-=a;
}
else if(lian==4)
{
y-=a;
}
else if(lian==5)
{
z-=a;
}
}
printf("%d %d %d %d\n",x,y,z,lian);
}
}