1 条题解
-
0
自动搬运
来自洛谷,原作者为

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; }其中使用随机数的原因是,这样不会让程序开始尝试填一堆 ,导致后面经常出现无解需要回溯的情况。
输入
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
- 上传者