头像

托起彩虹的年轻人




离线:3天前


最近来访(53)
用户头像
HfjNUlYZ
用户头像
lonefri
用户头像
yike
用户头像
bei
用户头像
MyloXyloto
用户头像
不点灯笼
用户头像
000_2
用户头像
Acwer
用户头像
bcwing
用户头像
Sora_k
用户头像
max2021
用户头像
种花家的虎式坦克
用户头像
是一个一个一个CE自动机啊啊啊啊啊啊啊啊啊啊啊啊啊
用户头像
yxc的小迷妹
用户头像
momodic
用户头像
Iamyou_9
用户头像
不会停止
用户头像
WNx
用户头像
AcWing_hyc
用户头像
xiaoYun

活动打卡代码 AcWing 51. 数字排列

class Solution {
public:
    vector<vector<int>> permutation(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>>ans;
        do{
            ans.push_back(nums);
        }while(next_permutation(nums.begin(),nums.end()));  // next_permutation返回比当前序列顺序大的第一个排列,若没有返回false
        return ans;
    }
};



class Solution {
public:
    int NumberOf1(int n) {
        int cnt=0;
        for(int i=0;i<32;i++)
         if(n>>i&1) cnt++;
        return cnt;
    }
};



#include<iostream>
using namespace std;

const int N=210;
string str[N];
int n;

int main()
{
    while(cin>>n,n)
    {
        int len=1e5+10;
        for(int i=0;i<n;i++)
        {
            cin>>str[i];
            if(len>str[i].size()) len=str[i].size();
        }

        while(len)
        {
            bool success=true;
            for(int i=1;i<n;i++)
            {
                bool is_same=true;
                int a=str[0].size(),b=str[i].size();
                for(int j=1;j<=len;j++)
                    if(str[0][a-j] != str[i][b-j])
                    {
                        is_same=false;
                        break;
                    }
                if(!is_same) success=false;
            }
            if(success) break;
            len--;
        }
        cout<<str[0].substr(str[0].size()-len,len)<<endl;
    }
    return 0;
}


活动打卡代码 AcWing 838. 堆排序

#include<iostream>

using namespace std;

const int N=1e5+10;
int heap[N],cnt;  // 一维数组存储堆
int n,m;  // 长度为n,前m个数

void down(int u)
{
    int t=u;
    if(u*2<=cnt && heap[u*2]<heap[t]) t=u*2;
    if(u*2+1<=cnt && heap[u*2+1]<heap[t]) t=u*2+1;
    if(u!=t) {
        swap(heap[u],heap[t]);
        down(t);
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&heap[i]);
    cnt=n;

    for(int i=n/2;i;i--) down(i);  // 建立初堆
    while(m--)  
    {
        printf("%d ",heap[1]);  // 取堆顶元素
        heap[1]=heap[cnt--];
        down(1);
    }
    return 0;
}


活动打卡代码 AcWing 1116. 马走日

#include<iostream>
#include<cstring>
using namespace std;

const int N=10;
int n,m;
int dx[]={1,2,2,1,-1,-2,-2,-1},dy[]={2,1,-1,-2,-2,-1,1,2};
bool st[N][N];
int K;

int dfs(int a,int b,int cnt)
{
    int ans=0;
    if(cnt==n*m) return 1;
    st[a][b]=true;
    for(int i=0;i<8;i++)
    {
        int x=a+dx[i],y=b+dy[i];
        if(x<0 || x>=n || y<0 || y>=m) continue;
        if(st[x][y]) continue;
        ans+=dfs(x,y,cnt+1);
    }
    st[a][b]=false;  // 在这里恢复现场
    return ans;
}
int main()
{
    scanf("%d",&K);
    while(K--)
    {
        int a,b;
        scanf("%d%d%d%d",&n,&m,&a,&b);
        cout<<dfs(a,b,1)<<endl;
    }
    return 0;
}


活动打卡代码 AcWing 1113. 红与黑

#include<iostream>
#include<cstring>
using namespace std;

const int N=25;
char g[N][N];
int n,m;
bool st[N][N];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};

int dfs(int a,int b)
{
    int cnt=0;
    if(g[a][b]=='.') cnt++;  // int cnt=1;
    st[a][b]=true;

    for(int i=0;i<4;i++)  
    {
        int x=a+dx[i],y=b+dy[i];
        if(x<0 || x>=n || y<0 || y>=m) continue;  // 越界
        if(g[x][y]!='.' || st[x][y]) continue;  // 障碍物
        cnt+=dfs(x,y);  
    }
    return cnt;
}
int main()
{
   while(cin >> m >> n,n || m)
   {
     memset(st,0,sizeof st);
     for(int i=0;i<n;i++)
     scanf("%s",&g[i]);

     int a,b;
     for(int i=0;i<n;i++)
      for(int j=0;j<m;j++)
       if(g[i][j]=='@') a=i,b=j;

     cout<<dfs(a,b)+1<<endl;    // cout<<dfs(a,b)<<endl;
   }
    return 0;
}



题目链接 ACwing 1113 红与黑
遍历结果总是少1,注释部分与y总代码不同
自己思路:cnt先赋值为0,再判断是否是'.',+1
y总思路:由于只有是'.',才会进入遍历,所以cnt直接从1开始

比较两种思路,我感觉按第一种写,也是一样的效果呀,由于进到程序中的一定是’.’,所以cnt先赋值为0,紧接着一定会变为1呀
代码:

#include<iostream>
#include<cstring>
using namespace std;

const int N=25;
char g[N][N];
int n,m;
bool st[N][N];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};

int dfs(int a,int b)
{
    int cnt=0;
    if(g[a][b]=='.') cnt++;  // int cnt=1;
    st[a][b]=true;

    for(int i=0;i<4;i++)  
    {
        int x=a+dx[i],y=b+dy[i];
        if(x<0 || x>=n || y<0 || y>=m) continue;  // 越界
        if(g[x][y]!='.' || st[x][y]) continue;  // 障碍物
        cnt+=dfs(x,y);  
    }
    return cnt;
}
int main()
{
   while(cin >> m >> n,n || m)
   {
     memset(st,0,sizeof st);
     for(int i=0;i<n;i++)
     scanf("%s",&g[i]);

     int a,b;
     for(int i=0;i<n;i++)
      for(int j=0;j<m;j++)
       if(g[i][j]=='@') a=i,b=j;

     cout<<dfs(a,b)+1<<endl;    // cout<<dfs(a,b)<<endl;
   }
    return 0;
}


活动打卡代码 AcWing 1112. 迷宫

#include<iostream>
#include<cstring>
using namespace std;

const int N=110;
char g[N][N];
bool st[N][N];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
int K;

bool dfs(int a,int b,int c,int d,int n)
{
    if(g[a][b]=='#') return false;
    if(a==c && b==d) return true;
    st[a][b]=true;
    for(int i=0;i<4;i++)
    {
        int x=a+dx[i],y=b+dy[i];
        if(x<0 || x>=n || y<0 || y>=n) continue;
        if(g[x][y]=='#' || st[x][y]) continue;
        if(dfs(x,y,c,d,n)) return true;  // 找到返回true,最开始没有判断导致出错
    }
    return false;
}
int main()
{
    scanf("%d",&K);
    while(K--)
    {
        memset(st,0,sizeof st);
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
         scanf("%s",&g[i]);

        int a,b,c,d;
        scanf("%d%d%d%d",&a,&b,&c,&d);
        if(dfs(a,b,c,d,n)) puts("YES");
        else puts("NO");
    }
    return 0;
}


活动打卡代码 AcWing 3496. 特殊年份

#include<iostream>
#include<string>
using namespace std;

bool check(string str)
{
    if(str[0]==str[2] && str[1]+1==str[3])
    return true;
    return false;
}
int main()
{
    int cnt=0;
    for(int i=0;i<5;i++)
    {
        string str;
        cin>>str;
        if(check(str)) cnt++;
    }
    cout<<cnt<<endl;
}


活动打卡代码 AcWing 1064. 小国王

#include<iostream>
#include<vector>
using namespace std;

const int N=12,M=N*N,K=1<<N;
long long f[N][M][K];
vector<int>st,trans[K];
int cnt[K],n,m;

bool check(int state)  // 判断是否含有相邻的1
{
    if(state&state>>1) return false;
    return true;
}
int count(int state)  // 计算state中1的个数
{
    int res=0;
    for(int i=0;i<n;i++)
     res+=state>>i&1;
    return res;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<1<<n;i++)  // 预处理合法状态
     if(check(i)){
         st.push_back(i);
         cnt[i]=count(i);
     }

    for(int i=0;i<st.size();i++)  // 预处理合法转移状态
     for(int j=0;j<st.size();j++)
      {
          int x=st[i],y=st[j];
          if((x&y)==0 && check(x|y))
            trans[x].push_back(y);
      }

    f[0][0][0]=1;
    for(int i=1;i<=n+1;i++)
     for(int j=0;j<=m;j++)
      for(auto cur:st)
       for(auto pre:trans[cur])
        if(j>=cnt[cur]) f[i][j][cur]+=f[i-1][j-cnt[cur]][pre];
    cout<<f[n+1][m][0]<<endl;
    return 0;
}