0
点赞
收藏
分享

微信扫一扫

算法题小总结(3)

灯火南山 2022-01-31 阅读 75
算法

目录

1.未来之迷

思路

代码展示

2.不要分心

思路

代码展示

3.过河卒

思路

代码展示

4.地毯

思路

代码展示

5.最小新整数

思路

代码展示

6.宇航员

思路

代码展示


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);
    }
}

举报

相关推荐

0 条评论