AcWing春季每日一题 Week3

1.AcWing 1683. 困牛放牧

题目

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
	int a,b,c,d1,d2;
	scanf("%d %d %d",&a,&b,&c);
	d1=b-a-1;
	d2=c-b-1;
	if(d1 == 0 && d2 == 0)
		printf("0\n0\n");
	else if(d1 == 0 || d2 == 0){
		int t = max(d1,d2);
		if(t == 1)
			printf("1\n1\n");
		else{
			printf("2\n%d\n",t);
		}
	}
	else{
	    if(d1 > d2)
	    	swap(d1,d2);
	    if(d1 == 1)
	    printf("1\n%d\n",d2);
	    else
	    printf("2\n%d\n",d2);
	}
	return 0;
} 

2.AcWing 1470. 水桶传递队列

题目

AC代码:

//解法一:广搜版
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
struct node{
	int x;
	int y;
	int f;
}st,ed;
char mapp[11][11];
int to[4][2]={0,1,0,-1,1,0,-1,0};
int book[11][11];
int bfs(){
	memset(book,0,sizeof(book));
	node now,nex;
	queue<node> q;
	ed.f = 0;
	book[ed.x][ed.y]=1;
	q.push(ed);
	while(!q.empty()){
		now = q.front();
		q.pop();
		if(now.x == st.x && now.y == st.y)
			return now.f-1;
		for(int i=0;i<4;i++){
			nex.x = now.x + to[i][0];
			nex.y = now.y + to[i][1];
			nex.f = now.f + 1;
			if(mapp[nex.x][nex.y] == 'R' || nex.x<0||nex.x>=10||nex.y<0||nex.y>=10||book[nex.x][nex.y]==1)
				continue;
			book[nex.x][nex.y]=1;
			q.push(nex);				
		}	
	}
	return 0;
}
int main(){
	for(int i=0;i<10;i++)
		scanf("%s",mapp[i]);
	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++){
			if(mapp[i][j]=='B'){
				st.x = i;
				st.y = j;
			}
			if(mapp[i][j]=='L'){
				ed.x = i;
				ed.y = j;
			}
		}
	}
	printf("%d\n",bfs());
	
	return 0;
}
//解法二:易懂版
#include <bits/stdc++.h>
using namespace std;

string g[10];
int bx, by, lx, ly, rx, ry;

int main()
{
    for (int i = 0; i < 10; i++)    cin >> g[i];

    for (int i = 0; i < 10; i++)
        for (int j = 0; j < 10; j++)
        {
            if (g[i][j] == 'B') bx = i, by = j;  // 记录牛棚的坐标
            if (g[i][j] == 'L') lx = i, ly = j;  // 记录湖的坐标
            if (g[i][j] == 'R') rx = i, ry = j;  // 记录岩石的坐标
        }

    int b2l = abs(bx - lx) + abs(by - ly);  // 牛棚到湖的曼哈顿距离
    int b2r = abs(bx - rx) + abs(by - ry);  // 牛棚到岩石的曼哈顿距离
    int r2l = abs(rx - lx) + abs(ry - ly);  // 岩石到湖的曼哈顿距离

    if ((bx == lx || by == ly) && b2l == b2r + r2l) 
        cout << b2l + 1 << endl;
    else 
        cout << b2l - 1 << endl;

    return 0;
}
//解法三:~~~
#include<bits/stdc++.h>
using namespace std;
char s[11];
int sx,sy,ex,ey,rx,ry;
int main()
{
    for(int i=1;i<=10;i++){
        cin>>s+1;
        for(int j=1;j<=10;j++){
            if(s[j]=='R')
            	rx=i,ry=j;//记录石头的x,y坐标
            else if(s[j]=='B')
            	ex=i,ey=j;//记录牛棚的x,y坐标
            else if(s[j]=='L')
            	sx=i,sy=j;//记录湖的x,y坐标
        }
    }
    int ans=abs(sx-ex)+abs(sy-ey)-1;
    //判断石头是否在两者中间
    //(sy<ry^ry<ey))为假的情况 ①sy<ry && ry>ey 
    //						  ②sy>ry && ry<ey 湖和牛棚在同一侧不经过石头
    
    if((rx==sx&&sx==ex&&!(sy<ry^ry<ey))||(ry==sy&&sy==ey&&!(sx<rx^rx<ex)))
    	ans+=2//理解一下还是能懂的
    cout<<ans;
}

3.AcWing 1761. 阻挡广告牌

题目

比较好理解的版本,染色法,注意左右只能去一个,上下也是

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int x1,y1,x2,y2;
int mapp[2100][2100];
int main(){
	memset(mapp,0,sizeof(mapp));
	for(int i=1;i<=3;i++){
		scanf("%d %d %d %d",&x1,&y1,&x2,&y2);			
		x1 += 1000;
		x2 += 1000;
		y1 += 1000;
		y2 += 1000;
		for(int j=x1;j<x2;j++)
			for(int k=y1;k<y2;k++){
				if(i==3)
					mapp[j][k] = 0;
				else
					mapp[j][k] = 1;
			}
	}
	int sum=0;
	for(int i=0;i<=2000;i++){
		for(int j=0;j<=2000;j++){
			if(mapp[i][j] == 1)
				sum++;
		}
	}
	printf("%d\n",sum);
	return 0;
} 

4.AcWing 1749. 阻挡广告牌 II

题目

AC代码:

#include <stdio.h>
int xx1,yy1,xx2,yy2;
int xx3,yy3,xx4,yy4;
int mapp[2100][2100];
bool check(int x,int y){
	if(x > xx1 && x < xx2 && y > yy1 && y < yy2)
		return true;
	else
		return false;
}
int main(){
	int sum = 0;
	scanf("%d %d %d %d",&xx1,&yy1,&xx2,&yy2);	
	scanf("%d %d %d %d",&xx3,&yy3,&xx4,&yy4);		
	xx1 += 1000; xx2 += 1000;
	yy1 += 1000; yy2 += 1000;
	xx3 += 1000; xx4 += 1000;
	yy3 += 1000; yy4 += 1000;
	for(int j=xx1;j<xx2;j++)
	for(int k=yy1;k<yy2;k++)
		mapp[j][k] = 1,sum++;
	
	for(int j=xx3;j<xx4;j++)
	for(int k=yy3;k<yy4;k++)
		mapp[j][k] = 0;
	
	
	
	if(check(xx3,yy3) || check(xx3,yy4) || check(xx4,yy3) || check(xx4,yy4) || (xx3 < xx2 && xx3 > xx1 && xx4 < xx2 && xx4 > xx1 ) || (yy3 < yy2 && yy3 > yy1 && yy4 < yy2 && yy4 > yy1)){
		printf("%d\n",sum);
			return 0;
			
	}
	sum = 0 ;
	for(int i=0;i<=2000;i++)
		for(int j=0;j<=2000;j++)
			if(mapp[i][j] == 1)
				sum++;
	
	printf("%d\n",sum);
	return 0;
} 

5.AcWing 1737. 传送

题目

AC代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
	int a,b,x,y;
	scanf("%d %d %d %d",&a,&b,&x,&y);
	if(a > b)
		swap(a,b);
	if(x > y)
		swap(x,y);
	printf("%d\n",min((b-a),abs(x-a)+abs(y-b))); 
	return 0;
}

6.AcWing 1725. 组队井字游戏

题目

AC代码:

#include <bits/stdc++.h>
using namespace std;

set<set<char>> ans[2];
string g[3];

void insert(vector<vector<int>> ps){
	set<char> S;
	for(auto& p : ps){
		int x = p[0],y= p[1];
		S.insert(g[x][y]);
	}
	if(S.size() == 1)
		ans[0].insert(S);
	else if(S.size() == 2)
		ans[1].insert(S);
}
int main()
{
	for(int i=0; i<3; i++) cin>>g[i];
	//行
	for(int i=0; i<3; i++)
	    insert({{i, 0}, {i, 1}, {i, 2}});
	//列
	for(int i=0; i<3; i++)
	    insert({{0, i}, {1, i}, {2, i}});
	//两条对角线
	insert({{0, 0}, {1, 1}, {2, 2}});
	insert({{2, 0}, {1, 1}, {0, 2}});
	
	cout<<ans[0].size()<<endl<<ans[1].size();
	
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值