计蒜客 2020 蓝桥杯大学 A 组省赛模拟赛 (一)题目及解析

新手,欢迎交流,剩下D题不知如何下手,望大佬指教。

计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析

文章目录

  • A. 结果填空:计算周长
  • B. 结果填空:七巧板
  • C. 结果填空:苹果
  • D. 结果填空:天气与活动
  • E. 结果填空:方阵
  • F. 程序设计:被袭击的村庄
  • G. 程序设计:建立联系
  • H. 程序设计:最短路
  • I. 程序设计:迷宫
  • J. 程序设计:涂墙

A. 结果填空:计算周长

原题链接:传送门

思路:

  1. V=abc , 如果把a*b看成一个整体,假设取ab为约数较小那个,有ab<=sqrt(V) 。
  2. 开根号枚举判断 。
  3. 答案是:46925458 。

代码如下:

#include
#define R register int
#define ll unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
int main()
{
    ll n=932065482;
    ll ans=n;
    for(int ab=1;ab*ab<=n;ab++)
    {
        if(n%ab==0){
            ll c=n/ab;
            for(int a=1;a*a<=ab;a++)
                if(ab%a==0)
                    ans=min(ans,2*(ab+a*c+ab/a*c));
        }
    }
    cout<<ans<<endl;
    return 0;
}


B. 结果填空:七巧板

原题链接:传送门

思路:

  1. 跟平面划分一个道理,每次都会多划分一个区域,F(n)=F(n-1)+1 。
  2. 答案是47 。 = 7+ (6+7+8+9+10)

代码如下:

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;

public class Main {
    
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        
        int x=7,a=6;
        for(int i=1;i<=5;i++)
        	x+=a++;
        System.out.println(x);
    }
}


C. 结果填空:苹果

原题链接:传送门

备注:

  1. 贪心,尽可能在一个篮子里拿3,从左到右遍历,能拿就拿,不能拿就拿后面的人的来凑。
  2. 答案:62 .
#include
#define R register int
#define ll unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
int main()
{
    // 7 2 12 5 9 9 8 10 7 10 5 4 5 8 4 4 10 11 3 8 7 8 3 2 1 6 3 9 7 1
    ll a[50],b[50];
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    for(int i=1;i<=30;i++) a[i]=read(),b[30-i+1]=a[i];
    ll ans1=0,ans2=0;
    for(int i=1;i<=30;i++){
        ans1+=a[i]/3;
        a[i]%=3;
        while(a[i]&&a[i+1]&&a[i+2]) ans1++,a[i]--,a[i+1]--,a[i+2]--;
    }
    for(int i=1;i<=30;i++){
        ans2+=b[i]/3;
        b[i]%=3;
        while(b[i]&&b[i+1]&&b[i+2]) ans2++,b[i]--,b[i+1]--,b[i+2]--;
    }
    cout<<max(ans1,ans2)<<endl;
    return 0;
}


D. 结果填空:天气与活动

原题链接:传送门

备注:

  1. 留坑。



E. 结果填空:方阵

原题链接:传送门

思路:

  1. 考虑两个点(x1,y1) 和 (x2,y2) ,假设a=x1-x2 , b=y1-y2;
  2. 能看到当且仅当gcd(a,b)=1 。
  3. 当a和b均大于0,即一对对答案的贡献为(n-a)*(n-b) 。
  4. 当ab其中有等于0时,需加上2n(n-1) 。
  5. 答案为:916585708

    代码如下:
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;

public class Main {
	
    static int gcd(int a, int b) {
		if(b==0) return a;
		else return gcd(b,a%b);
	}
    
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
       
        int n=cin.nextInt(),k=cin.nextInt();
        int gcds[][] =new int[n][n];
        for(int i=1;i<n;i++)
        	for(int j=1;j<n;j++)
        		if(gcds[i][j]==0&&gcds[j][i]==0)
        		{
        			gcds[i][j]=gcd(i,j);
        			gcds[j][i]=gcds[i][j];
        		}
        long ans=0;
        for(int i=1;i<n;i++)
        	for(int j=1;j<n;j++)
        		if(gcds[i][j]==1&&i*i+j*j<=k*k)
        			ans+=(n-i)*(n-j);
        ans=ans*2+2*n*(n-1);
        System.out.println((long)ans%(1e9+7));
    }
}


F. 程序设计:被袭击的村庄

原题链接:传送门

思路:

  1. 我觉得这道题是整套题里面最有毛病的,题目的output明显提示:第一行三个整数,分别是对道路、房屋、田地造成的总伤害,但实际上我计算三种类型的田地受到的总伤害,只通过了一个样例。
  2. 如果把对道路、房屋、田地造成的总伤害换成计算完全破坏的道路、房屋、田地个数(即hp=0),代码就AC了,这道模拟水题因为题意讲的不清楚只过了一个样例我也是醉了。
  3. 模拟题,根据题意写就可以了,注意炸弹可能会攻击村庄外的地方还有炸弹的伤害可能比hp还高,所以置0就好,因为是那天下午最后写的还没改,代码有点长,可以把攻击和溅射攻击写成两个函数,这样代码看起来就不会那么冗余。
  4. c++代码后面有赛后自己写的java简化代码,不过这题好像卡java了,可以学习一下写法,节省码代码的时间。

    C++代码如下:
#include
#define R register int
#define ll unsigned long long
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
const int manx=500;
ll hp[manx][manx];
ll hurt[manx][manx];
ll maps[manx][manx];
int dx[8]={-1,-1,-1,0,0,1,1,1},dy[8]={1,0,-1,1,-1,1,0,-1};
int main()
{
    ll n=read(),m=read();
    ll a=read(),b=read(),c=read();
    ll k=read(),w=read();
    for(int i=1;i<=k;i++)
        for(int j=1;j<=k;j++)
            hurt[i][j]=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            maps[i][j]=read();
            if(maps[i][j]==1) hp[i][j]=a;
            else if(maps[i][j]==2) hp[i][j]=b;
            else hp[i][j]=c;
        }
    ll q=read();
    while(q--)
    {
        ll id=read(),x=read(),y=read();
        if(id)
        {
            for(int i=x-k/2,ii=1;i<=x+k/2,ii<=k;i++,ii++)
            for(int j=y-k/2,jj=1;j<=y+k/2,jj<=k;j++,jj++)
            {
                if(i<=0||j<=0||i>n||j>m) continue;
                if(hp[i][j]){
                    if(hurt[ii][jj]>=hp[i][j])
                        hp[i][j]=0;
                    else hp[i][j]-=hurt[ii][jj];
                }
            }
        }
        else {
            for(int i=x-k/2,ii=1;i<=x+k/2,ii<=k;i++,ii++)
            for(int j=y-k/2,jj=1;j<=y+k/2,jj<=k;j++,jj++)
            {
                if(i<=0||j<=0||i>n||j>m) continue;
                if(hp[i][j]){
                    if(hurt[ii][jj]>=hp[i][j])
                        hp[i][j]=0;
                    else hp[i][j]-=hurt[ii][jj];
                }
                for(int d=0;d<8;d++){
                    int xx=dx[d]+i,yy=j+dy[d];
                    if(xx<=0||yy<=0||xx>n||yy>m) continue;
                    if(hp[xx][yy]){
                        if(hp[xx][yy]<=w) hp[xx][yy]=0;
                        else hp[xx][yy]-=w;
                    }
                }
            }
        }
    }
    ll res1=0,res2=0,res3=0,ans=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(maps[i][j]==1)
            {
                ans+=a-hp[i][j];
                if(hp[i][j]==0) res1++; //这里我原本写的是 res1+=a-hp[i][j];
            }
            else if(maps[i][j]==2){
                ans+=b-hp[i][j];
                if(hp[i][j]==0) res2++; //这里我原本写的是 res2+=b-hp[i][j];
            }
            else{
                ans+=c-hp[i][j];
                if(hp[i][j]==0) res3++; //这里我原本写的是 res3+=c-hp[i][j];
            }
        }
    cout<<res1<<" "<<res2<<" "<<res3<<endl;
    cout<<ans<<endl;
    return 0;
}



Java代码如下:

import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;

public class Main {
	static int n,m,a,b,c,k,w;
	static int maps[][] = new int[500][500];
	static int hp[][] = new int[500][500];
	static int hurt[][] = new int[51][51];
	static int dx[]={-1,-1,-1,0,0,1,1,1};
	static int dy[]={1,0,-1,1,-1,1,0,-1};
	
	static void js(int x, int y) {
		for(int i=0;i<8;i++) {
			int xx=x+dx[i],yy=dy[i]+y;
			if(xx<=0||yy<=0||yy>m||xx>n) continue;
			if(hp[xx][yy]>0){
                if(w>=hp[xx][yy])
                	hp[xx][yy]=0;
                else hp[xx][yy]-=w;
			}
		}	
	}
	
	static void gj(int id, int x, int y) {
		for(int i=x-k/2,ii=1;i<=x+k/2;i++,ii++)
			for(int j=y-k/2,jj=1;j<=y+k/2;j++,jj++)
			{
				 if(i<=0||j<=0||j>m||i>n) continue;
				 if(id==0) js(i,j);
				 if(hp[i][j]>0){
	                    if(hurt[ii][jj]>=hp[i][j])
	                        hp[i][j]=0;
	                    else hp[i][j]-=hurt[ii][jj];
				 }
			}
	}
	
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
       
        n=cin.nextInt();
        m=cin.nextInt();
        a=cin.nextInt();
        b=cin.nextInt();
        c=cin.nextInt();
        k=cin.nextInt();
        w=cin.nextInt();
        for(int i=1;i<=k;i++)
        	for(int j=1;j<=k;j++)
        		hurt[i][j]=cin.nextInt();
        for(int i=1;i<=n;i++)
        	for(int j=1;j<=m;j++) {
        		maps[i][j]=cin.nextInt();
        		if(maps[i][j]==1) hp[i][j]=a;
        		else if(maps[i][j]==2) hp[i][j]=b;
        		else hp[i][j]=c;
        	}
        int q=cin.nextInt();
        while(q-->0) {
        	int id=cin.nextInt(),x=cin.nextInt(),y=cin.nextInt();
        	gj(id,x,y);
        }
        long ans1=0,ans2=0,ans3=0,ans=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
                if(maps[i][j]==1)
                {
                    ans+=a-hp[i][j];
                    if(hp[i][j]==0) ans1++;
                }
                else if(maps[i][j]==2){
                	ans+=b-hp[i][j];
                	if(hp[i][j]==0) ans2++;
                }
                else{
                	ans+=c-hp[i][j];
                	if(hp[i][j]==0) ans3++;
                }
            }
        System.out.println(ans1+" "+ans2+" "+ans3);
        System.out.println(ans);
    }
}


G. 程序设计:建立联系

原题链接:传送门

思路:

  1. 最小生成树模板题,有k个人可以免费,那么只需要考虑n-k个人即可。
  2. 个人感觉 A组+B组 最简单的题目就是这个了。

    代码如下:
#include
#define R register int
#define ll unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
const int manx=2e5+5;
ll a[manx];
struct node{
    ll u,v,w;
}bian[2*manx];
bool cmp(node a, node b){
    return a.w<b.w;
}
ll find(ll x)
{
    if(a[x]==x) return x;
    else return a[x]=find(a[x]);
}
int main()
{
    ll n=read(),m=read(),k=read();
    for(int i=1;i<=n;i++) a[i]=i;
    for(int i=1;i<=m;i++)
        bian[i].u=read(),bian[i].v=read(),bian[i].w=read();
    sort(bian+1,bian+1+m,cmp);
    ll ans=0,index=1;
    for(int i=1;i<=m;i++){
        ll u=bian[i].u,v=bian[i].v,w=bian[i].w;
        ll fu=find(u),fv=find(v);
        if(fu==fv) continue;
        a[fv]=a[fu];
        ans+=w;
        if(index++==n-k) break;
    }
    cout<<ans<<endl;
    return 0;
}


H. 程序设计:最短路

原题链接:传送门

思路:

  1. 下午只建了一张图,过了40% 。
  2. 正反向建图跑一遍,目前过50% 。
  3. 好像 java被卡了 , 写了一发c++直接过了,c++代码在java下面。
  4. 这道题的话,要注意数据范围 javaLong C++long long,其他没什么好注意的,就是最短路模板题,正反向建图,跑两次dij就可以了。

    Java代码如下:
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;

public class Main {
    static class Edge{
        int v,w,next;
        Edge(int v,int w,int next){
            this.v=v;
            this.w=w;
            this.next=next;
        }
    }
    static int manx=1000000+5;
    static int mamx=manx;
    static int head[][]=new int[2][manx];
    static long d[][]=new long[2][manx];
    static boolean vis[]=new boolean[manx];
    static Edge a[][] = new Edge[2][mamx];
    static int cnt[] = new int[manx];
    static int n,m,s,k0=0,k1=0;
    static void add(int i,int u,int v, int w)
    {
    	int k;
    	if(i==0) k=k0;
    	else k=k1;
    	Edge x=new Edge(v,w,head[i][u]);
    	a[i][++k]=x;
    	head[i][u]=k;
    	if(i==0) k0=k;
    	else k1=k;
    }
    
    static void spfa(int x){
    	for(int i=1;i<=n;i++) {
    		d[x][i]=(long) 1e9;
    		vis[i]=false;
    	}
        Deque<Integer> q=new ArrayDeque<Integer>();
        q.add(s);
        d[x][s]=0;
        vis[s]=true;
        while(!q.isEmpty()){
            int u=q.poll();
            vis[u]=false;
            for(int i=head[x][u];i>0;i=a[x][i].next){
                int v=a[x][i].v;
                int w=a[x][i].w;
                if(d[x][v]>d[x][u]+w){
                    d[x][v]=d[x][u]+w;
                    if(!vis[v]) {
                    	vis[v]=true;
                    	if(!q.isEmpty()&&d[x][v]>=d[x][q.peek()]) q.addLast(v);
                    	else q.addFirst(v);
                    }
                }
            }
        }
    }
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int t=cin.nextInt();
        while(t-->0) {
        	n=cin.nextInt();
            m=cin.nextInt();
            k0=0;
            k1=0;
            s=1;
            for(int i=1;i<=n;i++) {
            	head[0][i]=0;
            	head[1][i]=0;
            }
            while(m-->0){
                int u=cin.nextInt();
                int v=cin.nextInt();
                int w=cin.nextInt();
                add(0,u,v,w);
                add(1,v,u,w);
            }
            spfa(0);
            spfa(1);
            long ans=0;
            for(int i=2;i<=n;i++)
            	ans+=d[1][i]+d[0][i];
            System.out.println(ans);
        }
    }
}


C++代码如下: (可AC)

#include
#define ll long long
#define R register int
#define mm make_pair
using namespace std;
const int manx=1e5+5;
const int mamx=manx;
struct node{
    int v,next;
    ll w;
}a[2][mamx];
ll d[2][manx];
int head[2][manx];
bool vis[manx];
int n,m,s,e,k0=0,k1=0;
void add(int i,int u,int v,int w)
{
    int k;
    if(i==0) k=k0; else k=k1;
    a[i][++k].next=head[i][u];
    head[i][u]=k;
    a[i][k].v=v;
    a[i][k].w=w;
    if(i==0) k0=k; else k1=k;
}
void dij(int x)
{
    for(int i=1;i<=n;i++) d[x][i]=1e16,vis[i]=0;
    priority_queue<pair<ll,int> >q;
    d[x][1]=0;
    q.push(make_pair(0,1));
    while(q.size()){
        int u=q.top().second;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=head[x][u];i;i=a[x][i].next)
        {
            int v=a[x][i].v,w=a[x][i].w;
            if(d[x][v]>d[x][u]+w)
                d[x][v]=d[x][u]+w,q.push(make_pair(-d[x][v],v));
        }
    }
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        k0=0,k1=0;
        memset(head,0,sizeof(head));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(0,u,v,w);
            add(1,v,u,w);
        }
        dij(0),dij(1);
        ll ans=0;
        for(int i=2;i<=n;i++){
            ans+=d[0][i]+d[1][i];
        }
        cout<<ans<<endl;
    }
    return 0;
}

I. 程序设计:迷宫

原题链接:传送门

思路:

  1. 关于这道题和那道村庄、重复项一样蛋疼,很容易理解错题意,原题描述有这么一句:
  2. 如果进入传送入口格子 ,那么会被立即传送到传送出口格子。
  3. 就是说你无法控制是否进入传送门 ,这是一个无法抗拒的过程,到达即传送,18号下午我以为是可以选择的,现在思考了一会儿才发现是必须要进去传送门的。
  4. 这道题是很经典的BFS迷宫题目,不过多了一些坑点,注意好还是很容易AC的,坑点如下:
    1 . 传送连环,就是一个传送门的终点是另一个传送门的起点;
    2 . 传送成环,就是传送出去一圈后会回到原本的传送出发点;
    3 . 传送到障碍物处 。

代码如下:

#include<bits/stdc++.h>
#define R register int
#define ll unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
const int manx=1005;
struct node{
    int x,y;
};
char mps[manx][manx];
int d[manx][manx];
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
bool vis[manx][manx];
int nx[105],ny[105];
int tp[manx][manx];
int n,m;
void bfs(){
    queue<node>q;
    while(q.size()) q.pop();

    int sx=1,sy=1;
    d[1][1]=0;
    while(tp[sx][sy]>0){
        int k=tp[sx][sy];
        sx=nx[k];
        sy=ny[k];
        d[sx][sy]=0;
        if(mps[sx][sy]=='*') return;
        if(sx==1&&sy==1) return;
    }
    node star;
    star.x=sx,star.y=sy;
    q.push(star);
    while(q.size()){
        node a=q.front();
        q.pop();
        vis[a.x][a.y]=1;
        for(int i=0;i<4;i++)
        {
            int xx=a.x+dx[i],yy=a.y+dy[i];
            if(xx>0&&xx<=n&&yy>0&&yy<=m&&mps[xx][yy]=='.'&&
            !vis[xx][yy]&&d[xx][yy]>d[a.x][a.y]+1){
                int sx=xx,sy=yy;
                d[xx][yy]=d[a.x][a.y]+1;
                int flag=0;
                while(tp[sx][sy]){
                    int k=tp[sx][sy];
                    sx=nx[k];
                    sy=ny[k];
                    if(mps[sx][sy]=='*') break;
                    if(sx==xx&&sy==yy) break;
                    d[sx][sy]=d[xx][yy];
                }
                if(!flag ||  ((sx!=xx||sy!=yy)&&mps[sx][sy]!='*'&&
                              d[sx][sy]>d[xx][yy])){
                    node b;
                    b.x=sx,b.y=sy;
                    q.push(b);
                }
            }
        }
    }
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>mps[i][j];
    ll p=read(),index=1;
    while(p--)
    {
        ll x=read(),y=read(),xx=read(),yy=read();
        nx[index]=xx,ny[index]=yy;
        tp[x][y]=index++;
    }
    ll ex=read(),ey=read();
    memset(d,inf,sizeof(d));
    bfs();
    if(d[ex][ey]==inf) cout<<"No solution"<<endl;
    else cout<<d[ex][ey]<<endl;
    return 0;
}


J. 程序设计:涂墙

原题链接:传送门

思路:

  1. 这道题模拟赛的时候只有一个人得了7分,算比较有趣的一道题。
  2. 原题是二维,我们不妨先考虑一维。
  3. n个格子,每次随机涂一个,求涂满m个格子的期望次数。
  4. 如概述所说,因为最终状态确定,使用逆推。设计状态 f[i] 表示涂了i个格子,到涂满m个格子还要涂的期望次数。初始状态是f[m]=0。转移时考虑f[i] 是怎么来的,有i/n的概率由“涂到涂过的格子”转移来,即由f[i]转移来;另有(n-i)/n​ 的概率由“涂到没涂过的格子”转移来,即由f[i+1] 来。并且无论从哪里来,这次的期望次数都比原来的期望次数多1。于是转移方程为
  5. dp[i]=i/n * dp[i] + (n-i)/n * dp[i+1]+1;
  6. 那么二维不过多了考虑行数,假设dp[i][j]表示当前i行涂红,j列涂红,有:
  7. dp[i][j] = i/n * j/n * dp[i][j] + i/n * (n-j)/n * dp[i][j+1] + (n-i)/n * j/n * dp[i+1][j] + (n-i)/n * (n-j)/n * dp[i+1][j+1] ;
  8. 移项化简就可以得到状态转移方程。

代码如下:

#include
#define R register int
#define ll unsigned long long
#define inf 0x3f3f3f3f
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
const int manx=2e3+5;
double dp[manx][manx];
bool r[manx],c[manx]; //column列 row 行
int main()
{
    ll p=read();
    while(p--)
    {
        ll n=read(),m=read();
        memset(r,0,sizeof(r));
        memset(c,0,sizeof(c));
        memset(dp,0,sizeof(dp));
        ll col,row;
        for(int i=1;i<=m;i++){
            row=read(),col=read();
            r[row]=1;
            c[col]=1;
        }
        col=0,row=0;
        for(int i=n;i>=1;i--){
            if(c[i]) col++;
            if(r[i]) row++;
        }
        for(int i=n;i>=0;i--)
            for(int j=n;j>=0;j--)
            {
                if(i==n&&j==n) continue;
                double x=n*n-i*j;
                dp[i][j]=i*(n-j)/x*dp[i][j+1]+(n-i)*j/x*dp[i+1][j]+
                (n-i)*(n-j)/x*dp[i+1][j+1]+1.0*n*n/x;
            }
        printf("%0.5lf\n",dp[row][col]);
    }
    return 0;
}



你可能感兴趣的:(蓝桥杯)