第二次CCF计算机软件能力认证

第一题:签到

#include
using namespace std;
const int N=1010;
int a[N];
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i

第二题:二维差分,暴力也可做

#include
using namespace std;
const int N=105,M=105;
int b[N][N];
//1~101
void insert(int x1,int y1,int x2,int y2){
    b[x1][y1]+=1;
    b[x2+1][y1]-=1;
    b[x1][y2+1]-=1;
    b[x2+1][y2+1]+=1;
}
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i

第三题: 字符串简单模拟

#include
using namespace std;
string get(string s){
    for(int i=0;i='A'&&s[i]<='Z') s[i]=s[i]-'A'+'a';
    }
    return s;
}
int main(){
    string s;cin>>s;
    int type;scanf("%d",&type);
    int n;scanf("%d",&n);
    while(n--){
        string ss;cin>>ss;
        if(type&&ss.find(s)!=-1) cout<

 第四题:bfs

#include
#define ll long long
using namespace std;
const int N=1010;
int dis[N][N];
bool g[N][N];
int n,m,k,d;
struct point{
    int x,y;
};
vector target;
vector v;
queue q;
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
void bfs(){
    while(q.size()){
        point fs=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int x=fs.x+dx[i];
            int y=fs.y+dy[i];
            if(x<=0||x>n||y<=0||y>n||g[x][y]) continue;
            if(dis[x][y]>dis[fs.x][fs.y]+1){
                dis[x][y]=dis[fs.x][fs.y]+1;
                q.push({x,y});
            }
        }
    }
}
int main(){
    memset(dis,0x3f,sizeof dis);
    scanf("%d%d%d%d",&n,&m,&k,&d);
    for(int i=0;i

第五题:状压dp+dfs暴搜建表+矩阵快速幂

#include
#define ll long long
using namespace std;
const int N=130,mod=1e9+7;
ll n;
int m;
int w[N][N];
int res[N][N];
void dfs(int x,int y,int u){
	if(u==m) w[x][y]++;
	else if(x>>u&1) dfs(x,y,u+1);
	else{
		if(u&&!(y>>u&1)&&!(y>>u-1&1)) dfs(x,y+(1<>u&1)&&!(y>>u+1&1)) dfs(x,y+(1<>u+1&1)){
			if(!(y>>u&1)) dfs(x,y+(1<>u+1&1)) dfs(x,y+(1<>=1;
	}
	printf("%d\n",res[0][(1<

 

 

 

你可能感兴趣的:(CCF)