1 条题解

  • 0
    @ 2025-8-24 22:51:40

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar cff_0102
    & aqua_qaq | 团子群 185800038 | 如果我死了说明我 AFO 了

    搬运于2025-08-24 22:51:40,当前版本为作者最后更新于2024-09-13 20:24:29,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    发现数据范围极小,可以直接打表。

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,c;
    int a[15][15];
    void dfs(int x,int y){
    	if(x==n+1){
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				cout<<a[i][j]<<",";
    			}cout<<endl;
    		}
    		exit(0);
    	}
    	int nx=x,ny=y+1;if(ny>m)ny=1,nx++;
    	int r=rand();
    	for(int i=r;i<=c+r;i++){//尝试填颜色 i%c+1
    		bool f=1;
    		for(int j=1;j<x;j++){
    			for(int k=1;k<y;k++){
    				if(a[j][k]==a[j][y]&&a[j][y]==a[x][k]&&a[x][k]==i%c+1)f=0;
    			}
    		}
    		if(f){
    			a[x][y]=i%c+1;
    			dfs(nx,ny);
    			a[x][y]=0;
    		}
    	}
    }
    int main(){
    	ios::sync_with_stdio(0);cin.tie(0);
    	srand(time(0));
    	cin>>n>>m>>c;
    	dfs(1,1);
    	return 0;
    }
    

    其中使用随机数的原因是,这样不会让程序开始尝试填一堆 11,导致后面经常出现无解需要回溯的情况。

    输入 8 9 3(输入再大点等待的就不知道多久了),运气好的话,等待几秒,就会出来一份答案:

    2,1,1,3,3,3,2,2,2,
    3,1,2,3,1,1,1,1,3,
    1,3,1,2,2,1,3,2,3,
    2,2,1,3,1,2,3,3,1,
    1,2,3,2,1,3,2,3,3,
    3,2,3,1,3,1,3,2,1,
    1,2,2,1,2,3,3,1,2,
    1,3,2,2,3,2,1,3,1,
    

    由此可以得到:

    int b[15][15]={
    	{0},
    	{0, 2,1,1,3,3,3,2,2,2,0},
    	{0, 3,1,2,3,1,1,1,1,3,0},
    	{0, 1,3,1,2,2,1,3,2,3,0},
    	{0, 2,2,1,3,1,2,3,3,1,0},
    	{0, 1,2,3,2,1,3,2,3,3,0},
    	{0, 3,2,3,1,3,1,3,2,1,0},
    	{0, 1,2,2,1,2,3,3,1,2,0},
    	{0, 1,3,2,2,3,2,1,3,1,0},
    	{0, 0,0,0,0,0,0,0,0,0,0},
    	{0, 0,0,0,0,0,0,0,0,0,0},
    };
    

    再进行小小的填空和手动微调:

    int b[15][15]={
    	{0},
    	{0, 2,1,3,3,1,3,2,1,2,1},
    	{0, 2,2,2,1,1,1,1,3,3,3},
    	{0, 1,3,2,1,2,3,2,1,1,3},
    	{0, 2,3,1,3,3,2,1,1,3,2},
    	{0, 2,1,3,2,3,1,3,2,1,3},
    	{0, 3,2,1,3,1,2,2,2,1,3},
    	{0, 1,2,1,3,2,1,3,3,2,1},
    	{0, 1,1,2,2,3,3,1,3,2,2},
    	{0, 3,1,1,1,2,3,3,2,3,2},
    	{0, 3,3,3,2,2,2,1,3,1,1},
    };
    

    再放到原来的代码中:

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,c;
    int a[15][15];
    int b[15][15]={
    	{0},
    	{0, 2,1,3,3,1,3,2,1,2,1},
    	{0, 2,2,2,1,1,1,1,3,3,3},
    	{0, 1,3,2,1,2,3,2,1,1,3},
    	{0, 2,3,1,3,3,2,1,1,3,2},
    	{0, 2,1,3,2,3,1,3,2,1,3},
    	{0, 3,2,1,3,1,2,2,2,1,3},
    	{0, 1,2,1,3,2,1,3,3,2,1},
    	{0, 1,1,2,2,3,3,1,3,2,2},
    	{0, 3,1,1,1,2,3,3,2,3,2},
    	{0, 3,3,3,2,2,2,1,3,1,1},
    };
    void dfs(int x,int y){
    	if(x==n+1){
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				cout<<a[i][j]<<" ";
    			}cout<<endl;
    		}
    		exit(0);
    	}
    	int nx=x,ny=y+1;if(ny>m)ny=1,nx++;
    	for(int i=1;i<=c;i++){//尝试填颜色 i
    		bool f=1;
    		for(int j=1;j<x;j++){
    			for(int k=1;k<y;k++){
    				if(a[j][k]==a[j][y]&&a[j][y]==a[x][k]&&a[x][k]==i)f=0;
    			}
    		}
    		if(f){
    			a[x][y]=i;
    			dfs(nx,ny);
    			a[x][y]=0;
    		}
    	}
    }
    int main(){
    	ios::sync_with_stdio(0);cin.tie(0);
    	cin>>n>>m>>c;
    	if(c==2)dfs(1,1);
    	else{
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=m;j++){
    				cout<<b[i][j]<<" ";
    			}cout<<endl;
    		}
    	}
    	return 0;
    }
    

    轻松 AC。

    • 1

    信息

    ID
    8701
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者