https://vjudge.net/problem/HDU-5113
给定一个 m*n的图,和k种颜色的数目,要求染色,相邻不能同颜色
搜索+回溯。
坑点:1 在输出的时候,最后一个数字和/n连起来输出就会wa。
(更正:不能这样输出printf(” %d\n”,col[i][j]));
其他就行。。。。后面附上蜜汁wa代码
2 在向上取整时,用ceil就会tle。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
int m,n,k;
int col[15][15];
int kin[30];
bool dfs(int x,int y,int ans){
if(ans==0) return true;
for(int i=1;i<=k;i++)
if(((ans+1)/2)<kin[i]) return false;
for(int j=1;j<=k;j++){
if(kin[j]&&col[x-1][y]!=j&&col[x][y-1]!=j){
kin[j]--;
col[x][y]=j;
if(y+1<=n)
{if(dfs(x,y+1,ans-1)) return true;}
else
if(dfs(x+1,1,ans-1)) return true;
kin[j]++;
col[x][y]=0;
}
}
return false;
}
int main()
{ int t;
scanf("%d",&t);
for(int tt=1;tt<=t;tt++){
scanf("%d%d%d",&m,&n,&k);
for(int j=1;j<=k;j++){
scanf("%d",&kin[j]);
}
memset(col,0,sizeof(col));
printf("Case #%d:\n",tt);
if(dfs(1,1,m*n))
{ puts("YES");
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(j==1)
printf("%d",col[i][j]);
else
printf(" %d",col[i][j]);
}
printf("\n");
}
}
else
puts("NO");
}
return 0;
}
wa代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
int m,n,k;
int col[15][15];
int kin[30];
bool dfs(int x,int y,int ans){
if(ans==0) return true;
for(int i=1;i<=k;i++)
if((ans+1)/2<kin[i]) return false;
for(int j=1;j<=k;j++){
if(kin[j]&&col[x-1][y]!=j&&col[x][y-1]!=j){
kin[j]--;
col[x][y]=j;
if(y+1<=n)
{if(dfs(x,y+1,ans-1)) return true;}
else
if(dfs(x+1,1,ans-1)) return true;
kin[j]++;
col[x][y]=0;
}
}
return false;
}
int main()
{ int t;
scanf("%d",&t);
for(int tt=1;tt<=t;tt++){
scanf("%d%d%d",&m,&n,&k);
for(int j=1;j<=k;j++){
scanf("%d",&kin[j]);
}
memset(col,0,sizeof(col));
printf("Case #%d:\n",tt);
if(dfs(1,1,m*n))
{ puts("YES");
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(j==1)
printf("%d",col[i][j]);
else if(j==n)
{ printf(" %d\n",col[i][j]);
//cout<<endl;
}else
printf(" %d",col[i][j]);
}
//printf("\n");
}
}
else
puts("NO");
}
return 0;
}