标签:blog http io os ar strong for 2014 sp
http://uva.onlinejudge.org/external/2/211.html
http://uva.onlinejudge.org/external/2/211.pdf
题意:每一种骨牌(Bone) 对应了两个球(Pip)。球的数值从0-6,骨牌从1-28。
然后给你一个包含球数值的矩阵(7*8),问你什么样的骨牌会形成这样的球的矩阵。
注意,题目有一个信息没有讲明白,那就是每种骨牌只能取一个,并且要取到所有的28种骨牌。7*8/28 = 2.
思路:对于每种骨牌,先从矩阵中寻找可以形成该骨牌的球对。有些骨牌可以有多种形成方式,
而有些骨牌则可能只有一种形成方式,因此这里要先考虑形成方式少的骨牌,排序!
之后,就暴力枚举每种骨牌的形成方式,有冲突的就pass。
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
#include<string>
#include<queue>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define FORE(i,a,b) for(int i=a;i<=b;i++)
#define FORD(i,a,b) for(int i=a;i>b;i--)
#define FORDE(i,a,b) for(int i=a;i>=b;i--)
#define SCF(a) scanf("%d",&a)
#define SCF2(a,b) scanf("%d%d",&a,&b)
#define SCF3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define SCFS(a) scanf("%s",a)
#define SCFC(a) scanf("%c",&a)
#define PRT(a) printf("%d",a);
#define PRTC(a) printf("%c",a);
#define PRTLN(a) printf("%d\n",a);
#define PRTLNU(a) printf("%lld\n",a);
#define PRTS(a) printf("%s\n",a);
#define min2(a,b) ((a)<(b))?(a):(b)
#define max2(a,b) ((a)>(b))?(a):(b)
#define MST(a,b) memset(a,b,sizeof(a));
#define swap(a,b) (a=(a)^(b),b=(a)^(b),a=(a)^(b))
#define pb push_back
typedef struct{
vector<int> lis;
int i,c;
}DAT;
DAT dat[28];
int ID[7][7];
int mat[7][8];
int ret[7][8];
int sol;
bool cmp(const DAT a,const DAT b){
return a.c>b.c;
}
void initID(){
int k = 0;
FORE(i,0,6)
FORE(j,i,6)
ID[j][i] = ID[i][j] = k++;
}
void init(){
sol=0;
FOR(i,0,28){
dat[i].lis.clear();
dat[i].i=i;
}
//down i-0
FOR(i,0,6)
FOR(j,0,8)
dat[ID[mat[i][j]][mat[i+1][j]]].lis.pb(i*8+j);
//right j-1
FOR(i,0,7)
FOR(j,0,7)
dat[ID[mat[i][j]][mat[i][j+1]]].lis.pb(i*8+j+56);
FOR(i,0,28)
dat[i].c = dat[i].lis.size();
sort(dat,dat+28,cmp);
MST(ret,0);
}
bool isok(int s){
if(s<56)
return !ret[s/8][s%8] && !ret[1 + s/8][s%8];
else{
s = s%56;
return !ret[s/8][s%8] && !ret[s/8][1 + s%8];
}
}
void assign(int s,int x){
if(s<56)
ret[s/8][s%8] = ret[1 + s/8][s%8] = x;
else{
s = s%56;
ret[s/8][s%8] = ret[s/8][1 + s%8] = x;
}
}
void print(int (*ret)[8]){
FOR(i,0,7){
FOR(j,0,8)
printf("%4d",ret[i][j]);
printf("\n");
}
printf("\n");
}
void dfs(int k){
if(k<0){
print(ret);
sol++;
return;
}
FOR(i,0,dat[k].c)
if(isok(dat[k].lis[i])){
assign(dat[k].lis[i],dat[k].i+1);
dfs(k-1);
assign(dat[k].lis[i],0);
}
}
int main(){
//freopen("data.in.txt","r",stdin);
//freopen("data.out.txt","w",stdout);
int cse = 1;
initID();
while(~SCF(mat[0][0])){
FOR(s,1,56)
SCF(mat[s/8][s%8]);
init();
if(cse>1)
printf("\n\n\n",cse);
printf("Layout #%d:\n\n",cse);
print(mat);
printf("Maps resulting from layout #%d are:\n\n",cse);
dfs(27);
printf("There are %d solution(s) for layout #%d.\n",sol,cse);
cse ++;
}
//fclose(stdout);
//fclose(stdin);
//system("pause");
return 0;
}
/*
5 4 3 6 5 3 4 6
0 6 0 1 2 3 1 1
3 2 6 5 0 4 2 0
5 3 6 2 3 2 0 6
4 0 4 1 0 0 4 1
5 2 2 4 4 1 6 5
5 5 3 6 1 2 3 1
4 2 5 2 6 3 5 4
5 0 4 3 1 4 1 1
1 2 3 0 2 2 2 2
1 4 0 1 3 5 6 5
4 0 6 0 3 6 6 5
4 0 1 6 4 0 3 0
6 5 3 6 2 1 5 3
*/
标签:blog http io os ar strong for 2014 sp
原文地址:http://blog.csdn.net/kevinkitty_love/article/details/39342461