c语言问题 给出完整代码

qq_39547541 2017-07-20 06:36:58
Gob 从家里的阁楼里找到了很多十字形的积木。而他的弟弟 Michael 则发现了一个 N*N 的
木板,上面恰好适合放这些积木。Gob想把这些积木占为己有,于是他和Michael打赌,“我
在木板上随便画一个图案,如果你可以看出可不可以用这些积木摆出一模一样的图案,那这
些积木就归你了;否则这块板就归我了。”
现在Gob 在板上画了几个复杂的图案。请你帮助Michael判断是否可以用积木将这些图案摆
出来。

输入格式(brick.in)
第一行一个正整数T,代表图案的个数。
接下来T组数据,每组代表一个图案。
每组数据的第一行一个整数 N,代表木板的大小。
接下来N 行描述Gob 画出的图案:’#’代表这个位置有图案,’.’则代表没有。

输出格式(brick.out)
输出共 T 行,每行为”YES”或“NO”。“YES”代表 Michael 可以用积木拼出这个图案;“NO”
则代表不可以。

样例输入
3
5
.#... ####.
.####
...#.
.....
6
.#..#.
######
.####.
.####.
######
.#..#.
3
...
...
...

样例输出
YES
NO
YES

数据范围
对于30%的数据,3 <= N <= 5.
对于60%的数据,3 <= N <= 15.
对于100%的数据,3 <= N <= 100. 1 <= T <= 10.
...全文
353 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-21
  • 打赏
  • 举报
回复
仅供参考:
//有一个6x6的矿区,分布有4处铁矿和4处煤矿,中心2x2已预先分配给4家公司经营。
//要求给出所有可能,将整个矿区划分为形状相同,内部连通,且恰好包含铁矿煤矿各一处的4块
//给这4家公司。
// 012345  012345  012345
//0...... 0.....M 0CCAAAA
//1...... 1....I. 1CCABAA
//2..AB.. 2...M.. 2CAABBB
//3..CD.. 3..MMI. 3CCCDDB
//4...... 4..I... 4DDCDBB
//5...... 5....I. 5DDDDBB
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
char W[6][6];
char M[6][6];
int Y[9],X[9];
char S[1000][37];
char s[37];
int N=0;
void divide(int y,int x,int L) {
    int m,y1,x1;
    int b,y2,x2;

    Y[L]=y;X[L]=x;
    W[  y][  x]='A';
    W[  x][5-y]='B';
    W[5-x][  y]='C';
    W[5-y][5-x]='D';
    if (L>=8) {
        for (y1=0;y1<6;y1++) {
            for (x1=0;x1<6;x1++) {
                s[y1*6+x1]=W[y1][x1];
            }
        }
        s[36]=0;
        for (m=0;m<N;m++) if (0==strcmp(s,S[m])) break;
        if (m>=N) {
            strcpy(S[N],s);
            N++;
//          printf("N%d:\n",N);
//          for (m=0;m<6;m++) printf("%.6s\n",s+m*6);
//          printf("\n");
//          getchar();
            if (N>=1000) {
                printf("N>=1000!\n");
                exit(1);
            }
        }
        W[  y][  x]='.';
        W[  x][5-y]='.';
        W[5-x][  y]='.';
        W[5-y][5-x]='.';
        return;
    }
    for (b=L;b>=0;b--) {
        y2=Y[b];x2=X[b];
        if ((y2>0 && W[y2-1][x2  ]=='.')
         || (x2>0 && W[y2  ][x2-1]=='.')
         || (y2<5 && W[y2+1][x2  ]=='.')
         || (x2<5 && W[y2  ][x2+1]=='.')) {
            for (m=0;m<4;m++) {
                switch (m) {
                case 0://上
                    y1=y2-1;x1=x2;
                    if (y1<0) continue;
                break;
                case 2://左
                    y1=y2;x1=x2-1;
                    if (x1<0) continue;
                break;
                case 1://下
                    y1=y2+1;x1=x2;
                    if (y1>5) continue;
                break;
                case 3://右
                    y1=y2;x1=x2+1;
                    if (x1>5) continue;
                break;
                }
                if (W[  y1][  x1]=='.'
                 && W[  x1][5-y1]=='.'
                 && W[5-x1][  y1]=='.'
                 && W[5-y1][5-x1]=='.') {
                    divide(y1,x1,L+1);
                    W[  y1][  x1]='.';
                    W[  x1][5-y1]='.';
                    W[5-x1][  y1]='.';
                    W[5-y1][5-x1]='.';
                }
            }
        }
    }
}
int main() {
    int i,n,a,b,t;
    int d[36];
    int y,x;
    int Ic[4],Mc[4];

    srand(time(NULL));
    n=36;
    for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
    for (i=n;i>0;i--) {/* 打乱0~n-1 */
        a=i-1;b=rand()%i;
        if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
    }
    for (y=0;y<6;y++) for (x=0;x<6;x++) {
        W[y][x]='.';M[y][x]='.';
    }
    for (i=0;i<4;i++) M[d[i]/6][d[i]%6]='I';//铁
    for (i=4;i<8;i++) M[d[i]/6][d[i]%6]='M';//煤
    for (y=0;y<6;y++) {
        for (x=0;x<6;x++) {
            printf("%c",M[y][x]);
        }
        printf("\n");
    }
    printf("\n");
    divide(2,2,0);
    n=0;
    for (i=0;i<N;i++) {
        for (t=0;t<4;t++) {Ic[t]=0;Mc[t]=0;}
        for (y=0;y<6;y++) {
            for (x=0;x<6;x++) {
                if (M[y][x]=='I') Ic[S[i][y*6+x]-'A']++;
                if (M[y][x]=='M') Mc[S[i][y*6+x]-'A']++;
            }
        }
        if (Ic[0]==1 && Ic[1]==1 && Ic[2]==1 && Ic[3]==1
         && Mc[0]==1 && Mc[1]==1 && Mc[2]==1 && Mc[3]==1) {
            n++;
            printf("%d:\n",n);
            for (t=0;t<6;t++) printf("%.6s\n",S[i]+t*6);
            printf("\n");
        }
    }
    if (n==0) printf("Impossible.\n");
    return 0;
}
//..M...
//I.M..I
//......
//...M.M
//...I..
//....I.
//
//1:
//CCCAAA
//CAAABA
//CCABBA
//DCCDBB
//DCDDDB
//DDDBBB
//
//2:
//CCCAAA
//CCAAAA
//CCABBA
//DCCDBB
//DDDDBB
//DDDBBB
//
//
战在春秋 2017-07-21
  • 打赏
  • 举报
回复
引用
积木
此类问题不一定能直接搜索到。 可以先将问题归纳,转化为对应的经典算法,然后搜索相关经典算法的求解。 在这基础上结合问题设计算法。
赵4老师 2017-07-21
  • 打赏
  • 举报
回复
百度搜相关关键字。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧