TOJ 3858 Home 搜索

来源:互联网 发布:四维数据的图形表示 编辑:程序博客网 时间:2024/06/03 22:11

裸搜就可以了。注意好边界条件。

传送门:http://acm.tju.edu.cn/toj/showp3858.html

#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <iostream>int h[12],v[12];bool Map[11][11];int ans_flag;int n;void print() {    for(int i = 0 ; i < 10 ; i++) {        for(int j = 0 ; j < 10 ; j++) {            printf("%d ",Map[i][j]);        }        puts("");    }    puts("");}void DFS(int cen){    if(ans_flag)return ;    if(cen >= n) {       // puts("Hello");        ans_flag = 1;        return ;    }    //print();    for(int i = 0 ; i < 10 ; i++) {        for(int j = 0 ; j < 10 ; j ++) {            int flag = 0;            for(int ii = 0 ; ii < h[cen] ; ii ++) {                for(int jj = 0 ; jj < v[cen] ; jj ++){                    if(i + ii >= 10 || j + jj >= 10 || Map[i+ii][j+jj]) {                        flag = 1;                        break;                    }                }            }            if(flag == 0) {                for(int ii = 0 ; ii < h[cen] ; ii ++) {                    for(int jj = 0 ; jj < v[cen] ; jj ++){                        Map[i + ii][j + jj] = 1;                   }                }                DFS(cen+1);                for(int ii = 0 ; ii < h[cen] ; ii ++) {                    for(int jj = 0 ; jj < v[cen] ; jj ++){                        Map[i + ii][j + jj] = 0;                    }                }            }            flag = 0;            for(int ii = 0 ; ii < v[cen] ; ii ++) {                for(int jj = 0 ; jj < h[cen] ; jj ++){                    if(i + ii >= 10 || j + jj >= 10 || Map[i+ii][j+jj]) {                        flag = 1;                        break;                    }                }            }            if(flag == 0) {                for(int ii = 0 ; ii < v[cen] ; ii ++) {                    for(int jj = 0 ; jj < h[cen] ; jj ++){                        Map[i + ii][j + jj] = 1;                    }                }                DFS(cen+1);                for(int ii = 0 ; ii < v[cen] ; ii ++) {                    for(int jj = 0 ; jj < h[cen] ; jj ++){                        Map[i + ii][j + jj] = 0;                    }                }            }        }    }}void Deal_with() {    while(~scanf("%d",&n)) {        for(int i = 0 ; i < n ; i++) {            scanf("%d%d",h+i,v+i);        }        ans_flag = 0;        memset(Map,0,sizeof(Map));        DFS(0);        if(ans_flag == 0) {            puts("No");        }        else {            puts("Yes");        }    }}int main(void) {    //freopen("a.in","r",stdin);    Deal_with();    return 0;} 



0 0
原创粉丝点击