| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
附 : 16MS代码。思路:
(1) 化为2分图匹配。
(2) 格子分为奇偶, 奇和偶格子都编号,并且都是从1,2,3,顺序。(这样2分图的大小小很多)
(3) 格子坐标(i,j) -> 2分图的节点编号转换,并且事先计算好。
(4) 套算法了。
=====================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ROW (32*32/2 + 4)
#define MAX_COL (32*32/2 + 4)
int row,col;
int x_num,y_num,holes,x_holes; //row: (0,32], colum:(0,32], and holes:[0,m*n]
int matrix[MAX_ROW][MAX_COL]; //
int id[MAX_ROW][MAX_COL]; //
int nid[MAX_ROW][4]; //neibor id
int match[MAX_COL], visit[MAX_COL];
int find_path(int v){ //here just only max 4 lines!
int i = 0,j=0;
for(j=0;j<4;j++){
i = nid[v][j]; //get neibor node!
if( matrix[v][i] && !visit[i] ){
visit[i] = 1; //
if( !match[i] ){
//ret = 1;
match[i] = v;
return 1;
}
else if(match[i]!=v) {
//ret = find_path(match[i]);
if( find_path(match[i]) ) {
match[i] = v;
return 1;
}
}
else{ //not need to find!
}
}
}
return 0;
}
void input()
{
#define get_num(m,n,i,j) (((i-1)*n + j + 1)/2)
#define is_x(i,j) ((i+j+1)%2)
int i,j;
int m,n,k;
scanf("%d %d %d",&m,&n,&k);
row = m;col=n;
x_num = (m*n+1)/2;
y_num = (m*n)/2;
holes = k;x_holes=0;
memset(match, 0 , sizeof(int)*(y_num+1)); //clear all match data!
memset(matrix, 0 , sizeof(int)*MAX_ROW*MAX_COL); //clear all data!
memset(id, 0 , sizeof(int)*MAX_ROW*MAX_COL); //clear all data!
memset(nid, 0 , sizeof(int)*MAX_ROW*4); //clear all data!
for(i=1;i<=m;i++)
for(j=1;j<=n;j++){
id[i][j] = get_num(m,n,i,j);
}
for(i=1;i<=m;i++){
for(j=1;j<=n;j++){
int x = id[i][j]; //get_num(m,n,i,j); //get no.
if( is_x(i,j) ){
if( i>1 ) {
matrix[x][id[i-1][j]] = 1;
nid[x][0]=id[i-1][j];
} //else{ nid[x][0]=0; }
if( i<m ) {
matrix[x][id[i+1][j]] = 1;
nid[x][1]=id[i+1][j];
} //else {nid[x][1] = 0;}
if( j>1 ) {
matrix[x][id[i][j-1]] = 1;
nid[x][2]=id[i][j-1];
} //else {nid[x][2] = 0;}
if( j<n ) {
matrix[x][id[i][j+1]] = 1;
nid[x][3]=id[i][j+1];
} //else { nid[x][3] = 0;}
}else{
//if( i>1 ) matrix[get_num(m,n,i-1,j)][x] = 1;
//if( i<m ) matrix[get_num(m,n,i+1,j)][x] = 1;
//if( j>1 ) matrix[get_num(m,n,i,j-1)][x] = 1;
//if( j<n ) matrix[get_num(m,n,i,j+1)][x] = 1;
}
}
}
while(k --){
scanf("%d %d",&j,&i);
int x = get_num(m,n,i,j); //get no.
if( is_x(i,j) ){
x_holes ++;
if( i>1 ) matrix[x][get_num(m,n,i-1,j)] = 0;
if( i<m ) matrix[x][get_num(m,n,i+1,j)] = 0;
if( j>1 ) matrix[x][get_num(m,n,i,j-1)] = 0;
if( j<n ) matrix[x][get_num(m,n,i,j+1)] = 0;
}else{
if( i>1 ) matrix[get_num(m,n,i-1,j)][x] = 0;
if( i<m ) matrix[get_num(m,n,i+1,j)][x] = 0;
if( j>1 ) matrix[get_num(m,n,i,j-1)][x] = 0;
if( j<n ) matrix[get_num(m,n,i,j+1)][x] = 0;
}
}
}
void solve()
{
int ans = 0, i=0;
input(); // input data!
if( (x_num - x_holes) != (y_num - holes + x_holes) ){
puts("NO");
}else{
for(i=1;i<=x_num;i++){
memset(visit, 0, sizeof(int)*(y_num+1));
if( find_path(i) ) ans ++;
}
if( ans + x_holes == x_num ) puts("YES");
else puts("NO");
}
//printf("x_num=%d, y_num=%d, x_holes=%d,y_holes=%d ,ans=%d\n",x_num,y_num,x_holes,holes-x_holes,ans);
}
int main()
{
//printf("Hello \n");
solve();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator