精华内容
下载资源
问答
  • D-多连块拼图

    2019-10-07 13:15:41
    多连块是指由多个等大正方形边与边连接而成的平面连通图形。...中间那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连块...

    多连块是指由多个等大正方形边与边连接而成的平面连通图形。
    – 维基百科

    给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只能平移,不能旋转或者翻转。两个小多连块不得重叠。左下图是一个合法的拼法,但右边两幅图都非法。中间那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连块画在右下方)。
    这里写图片描述
    Input
    输入最多包含20组测试数据。每组数据第一行为两个整数n和m(1<=m<=n<=10)。以下n行描述大多连块,其中每行恰好包含n个字符或者.,其中表示属于多连块,.表示不属于。以下m行为小多连块,格式同大多连块。输入保证是合法的多连块(注意,多连块至少包含一个正方形)。输入结束标志为n=m=0。
    Output
    对于每组测试数据,如果可以拼成,输出1,否则输出0。
    Sample Input
    4 3
    .**.
    ****
    .**.
    ….
    **.
    .**

    3 3
    ***
    *.*
    ***
    *..
    *..
    **.
    4 2
    ****
    ….
    ….
    ….
    *.
    *.
    0 0
    Sample Output
    1
    0
    0
    Hint

    分析:
    因为题中说不能旋转,所以枚举第一块和第二块的位置即可;
    代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    
    using namespace std;
    const int N = 10 + 5;
    
    char goal[N][N];
    char mat[N][N],st[N][N],tmp[N][N];
    struct node{
        int x,y;
    }Node[105];
    int cnt,n,m;
    void To_left_top(){
        int dx=0,dy=0,i,j;
        for(i=0;i<m;i++){
            for(j=0;j<m;j++) if(st[i][j]=='*') break;
            if(j == m) dx--;
            else break;
        }
        for(j=0;j<m;j++){
            for(i=0;i<m;i++) if(st[i][j]=='*') break;
            if(i == m) dy--;
            else break;
        }
        for(int i=0;i<cnt;i++) Node[i].x+=dx,Node[i].y+=dy;
    }
    void print(){
       for(int i=0;i<cnt;i++){
                mat[Node[i].x][Node[i].y] = '*';
            }
            for(int i=0;i<m;i++){
                for(int j=0;j<m;j++){
                    printf("%c",mat[i][j]);
                    if(j==m-1) printf("\n");
                }
            }
    }
    bool match(){
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            if(goal[i][j]!=tmp[i][j]) return false;
        return true;
    }
    bool next_add(int x,int y){
        memcpy(tmp,mat,sizeof(mat));
        for(int i=0;i<cnt;i++){
            int newx = x + Node[i].x;
            int newy = y + Node[i].y;
            if(newx>=n || newy>=n || tmp[newx][newy]=='*') return false;
            tmp[newx][newy] = '*';
        }
        if(match()) return true;
        else return false;
    }
    bool add(int x,int y){
        memset(mat,'.',sizeof(mat));
        for(int i=0;i<cnt;i++){
            int newx = Node[i].x + x;
            int newy = Node[i].y + y;
            if(newx>=n || newy>= n) return false;
            mat[newx][newy] = '*';
        }
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            if(!next_add(i,j)) continue;
            else return true;
        }
        return false;
    }
    bool solve(){
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++){
            if(!add(i,j)) continue;
            else return true;
        }
        return false;
    }
    int main(){
        while(scanf("%d %d",&n,&m)==2 &&(n||m)){
            cnt = 0;
            for(int i=0;i<n;i++) scanf("%s",goal[i]);
            for(int i=0;i<m;i++){
                scanf("%s",st[i]);
                for(int j=0;j<m;j++) if(st[i][j]=='*') Node[cnt].x = i,Node[cnt++].y = j;
            }
            To_left_top();
            printf("%s\n",solve()?"1":"0");
        }
    }

     

    转载于:https://www.cnblogs.com/Pretty9/p/7347691.html

    展开全文
  • 多连块拼图

    千次阅读 2014-08-14 16:24:01
    多连块是指由多个等大正方形边与边连接而成的平面连通图形。 -- 维基百科 给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只 能平移,不能旋转或者翻转。两个小...
    多连块是指由多个等大正方形边与边连接而成的平面连通图形。
    -- 维基百科
    给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只
    能平移,不能旋转或者翻转。两个小多连块不得重叠。左下图是一个合法的拼法,但右边两幅图都非法。中间
    那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的
    小多连块(给定的小多连块画在右下方)。
    输入
    输入最多包含 20 组测试数据。每组数据第一行为两个整数 n 和 m(1<=m<=n<=10)。以下 n 行描述大多连
    块,其中每行恰好包含 n 个字符*或者.,其中*表示属于多连块,.表示不属于。以下 m 行为小多连块,格式同大
    多连块。输入保证是合法的多连块(注意,多连块至少包含一个正方形)。输入结束标志为 n=m=0。
    输出
    对于每组测试数据,如果可以拼成,输出 1,否则输出 0。
    样例输入 样例输出
    4 3
    .**.
    ****
    .**.
    ....
    **.
    .**
    ...
    3 3
    ***
    *.*
    ***
    *..
    *..
    **.
    4 2
    ****
    ....
    ....
    ....
    *.
    *.
    0 0
    1
    0

    0

    <span style="font-size:14px;">#include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<vector>
    #define Max 14
    using namespace std;
    struct point 
    {
    	int x,y;
    };
    char mp1[Max][Max],mp2[Max][Max];
    int m,n;
    vector<point> vec;//用来储存匹配方块的形状
    bool is(int x,int y)
    {
    	return x>=0&&x<m&&y>=0&&y<m;
    }
    bool can_put(int x,int y)//判断是否能放当前这个方块
    {
    	int nx=x,ny=y,i;
    	for(i=1;i<vec.size();i++)
    	{
    			nx=nx+vec[i].x;
    			ny=ny+vec[i].y;
    		if(mp1[nx][ny]!='*'||!is(nx,ny)) return 0;
    	}
    		return 1;
    }
    void put(int x,int y)//放方块
    {
    	int nx=x,ny=y,i;
    	mp1[nx][ny]='.';
    	for(i=1;i<vec.size();i++)
    	{
    		nx=nx+vec[i].x;
    		ny=ny+vec[i].y;
    		mp1[nx][ny]='.';
    	}
    }
    bool over1()
    {
    	int i,j;
    	for(i=0;i<m;i++)
    		for(j=0;j<m;j++)
    			if(mp1[i][j]=='*') return 0;
    	return 1;
    }
    int main()
    {
    	//freopen("b.txt","r",stdin);
    	while(scanf("%d %d",&m,&n)==2&&m+n)
    	{
    		vec.clear();
    		bool flag=1;
    		int i,j,x=0,y=0;
    		point p;
    		for(i=0;i<m;i++)
    			scanf("%s",mp1[i]);
    		for(i=0;i<n;i++)
    			scanf("%s",mp2[i]);
    		for(i=0;i<n;i++)
    			for(j=0;j<n;j++)
    			{
    				if(mp2[i][j]=='*')
    				{
    					p.x=i-x,p.y=j-y;
    					vec.push_back(p);//保存匹配方块中当前'*'与上一个'*'的坐标差值
    					x=i,y=j;
    				}
    			}
    			for(i=0;i<m;i++)
    			{
    				for(j=0;j<m;j++)
    				{
    					if(mp1[i][j]=='*')
    					{
    						if(can_put(i,j))
    							put(i,j);
    					}
    				}
    			}
    			if(over1()==1) printf("1\n");
    			else printf("0\n");
    	}
    	return 0;
    }
    
    
    
    
    
    </span>


    展开全文
  • C - 多连块拼图

    2017-08-22 16:16:05
    多连块是指由多个等大正方形边与边连接而成的平面连通图形。...中间那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连块画在右下方
    
    

    多连块是指由多个等大正方形边与边连接而成的平面连通图形。
    —— 维基百科

    给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只能平移,不能旋转或者翻转。两个小多连块不得重叠。左下图是一个合法的拼法,但右边两幅图都非法。中间那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连块画在右下方)。

    Input

    输入最多包含20组测试数据。每组数据第一行为两个整数n和m(1<=m<=n<=10)。以下n行描述大多连块,其中每行恰好包含n个字符或者.,其中表示属于多连块,.表示不属于。以下m行为小多连块,格式同大多连块。输入保证是合法的多连块(注意,多连块至少包含一个正方形)。输入结束标志为n=m=0。

    Output

    对于每组测试数据,如果可以拼成,输出1,否则输出0。

    Sample Input
    4 3
    .**.
    ****
    .**.
    ....
    **.
    .**
    ...
    3 3
    ***
    *.*
    ***
    *..
    *..
    **.
    4 2
    ****
    ....
    ....
    ....
    *.
    *.
    0 0
    
    Sample Output
    1
    0
    0
    

    Hint

    没写好,少了俩小块不能完全覆盖大块的判断,但既然没这个坑。。。就简单写了,先分别找两方块的第一个点来确定位置差,然后遍历判断是否匹配,再遍历第二遍


    #include<cstdio>
    #include<cstring>
    int n,m,i,j,x1,y1,x2,y2;
    char a[20][20],b[20][20];
    int pipei(){
    	for(i=0;i<m;i++){
    		for(j=0;j<m;j++){
    			if(b[i][j]=='*'){
    				if(a[x1-x2+i][y1-y2+j]=='*')a[x1-x2+i][y1-y2+j]='.';
    				else return 0;
    			}
    		}
    	}
    	return 1;
    }
    int main(){	
    	while(~scanf("%d%d",&n,&m)){
    		if(!n&&!m)break;
    		memset(a,0,sizeof(a));
    		memset(b,0,sizeof(b));
    		for(i=0;i<n;i++)scanf("%s",a[i]);
    		for(i=0;i<m;i++)scanf("%s",b[i]);
    		for(i=0;i<n;i++)
    			for(j=0;j<n;j++)
    				if(a[i][j]=='*')x1=i,y1=j;
    		for(i=0;i<m;i++)
    			for(j=0;j<m;j++)
    				if(b[i][j]=='*')x2=i,y2=j;
    		if(pipei()){
    			for(i=0;i<n;i++)
    				for(j=0;j<n;j++)
    					if(a[i][j]=='*')x1=i,y1=j;
    			if(pipei())printf("1\n");
    			else printf("0\n");
    		}	
    		else printf("0\n");
    	}
    }


    展开全文
  • C/C++ 多连块拼图

    2018-09-26 09:31:20
    题目描述 多连块是指由多个等大正方形边与边连接而成的平面连通图形。...中间那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连...

    题目描述

    多连块是指由多个等大正方形边与边连接而成的平面连通图形。 -- 维基百科

      
    给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只能平移,不能旋转或者翻转。两个小多连块不得重叠。左下图是一个合法的拼法,但右边两幅图都非法。中间那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连块画在右下方)。

    输入

    输入最多包含20组测试数据。每组数据第一行为两个整数n和m(1<=m<=n<=10)。以下n行描述大多连块,其中每行恰好包含n个字符*或者.,其中*表示属于多连块,.表示不属于。以下m行为小多连块,格式同大多连块。输入保证是合法的多连块(注意,多连块至少包含一个正方形)。输入结束标志为n=m=0。 
     

    输出

    对于每组测试数据,如果可以拼成,输出1,否则输出0。

    样例输入

    4 3 
    .**. 
    **** 
    .**. 
    .... 
    **. 
    .** 
    ... 
    3 3 
    *** 
    *.* 
    *** 
    *.. 
    *.. 
    **. 
    4 2 
    **** 
    .... 
    .... 
    .... 
    *. 
    *. 
    0 0 

    样例输出

    1 
    0 
    0 
     #include <stdio.h>
     int daysOfMonth(int y,int m);
     //计算任意两个日期之间的天数
     
     //判断输入有效
     int valiDate(int y,int m,int d){
        if(y>3000||y<1900){
           printf("error year!\n");
        return 1;
        }
      if(m>12||m<1){
            printf("error month!\n");
        return 1;
        }
        if(d>daysOfMonth(y,m)||d<1){
            printf("error day!\n");
        return 1;
        }
        return 0;
     }
     
     //一个整月的天数
     int daysOfMonth(int y,int m){
        if(m==2){
           if(y%4==0&&y%100!=0||y%400==0){
            return 29;
        }else{
            return 28;
        }
        }else if(m==4||m==6||m==9||m==11){
                return 30;
       }else{
                return 31;
        }
     }
     
     //输入年份已经过的天数
     int daysBefore(int y,int m,int d){
        int i,result=0;
        for(i=1;i<=12;i++){
            if(i==m){
           result += d;
            return result;
        }else{
            result += daysOfMonth(y,i);
        }
        }
     }
     
     //计算每年天数
     int daysOfYear(int y){
        if(y%4==0&&y%400!=0||y%400==0){
            return 366;
        }else return 365;
     }
     //主函数
     int main(){
        int y1,m1,d1,y2,m2,d2;
    	while(scanf("%d%d%d",&y1,&m1,&d1)!=EOF)
    	{
        
       while(valiDate(y1,m1,d1)){
            scanf("%d%d%d",&y1,&m1,&d1);
        }
        scanf("%d%d%d",&y2,&m2,&d2);
        while(valiDate(y2,m2,d2)){
            scanf("%d%d%d",&y2,&m2,&d2);
    
        }
       int i,result=0;
        for(i=y1;i<y2;i++){
           result += daysOfYear(i);
       }
        result = result - daysBefore(y1,m1,d1) + daysBefore(y2,m2,d2);
        printf("%d/%d/%d-%d/%d/%d=%d\n",y2,m2,d2,y1,m1,d1,result);
    	}
       return 0;
    }

     

    展开全文
  • CSU 1102 多连块拼图

    2016-08-17 20:17:00
    多连块拼图 时间限制:1000ms | 内存限制:65535KB 难度:4 描述多连块是指由多个等大正方形边与边连接而成的平面连通图形。 ————维基百科 给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个...
  • toj 4317 多连块拼图

    千次阅读 2016-08-17 16:11:42
    toj 4317 多连块拼图 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 总提交: 40 测试通过:21 描述多连块是指由多个等大正方形边与边连接而成的平面连通图形。 ———— 维基百科给一个大多连块和小多连...
  • zcmu-1644 多连块拼图

    2017-08-22 13:46:00
    C - 多连块拼图 多连块是指由多个等大正方形边与边连接而成的平面连通图形。 —— 维基百科 给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只能平移,不能旋转或者...
  • 多连块是指由多个等大正方形边与边连接而成的平面连通图形。 -- 维基百科 给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只 能平移,不能旋转或者翻转。两个小多连块...
  • 多连块拼图 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述  多连块是指由多个等大正方形边与边连接而成的平面连通图形。 ———— 维基百科   给一个大多连块和小多连块,你的任务是判断大多...
  • 多连块拼图 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述  多连块是指由多个等大正方形边与边连接而成的平面连通图形。 ———— 维基百科   给一个大多连块和小多连块,你的...
  • 题目C多连块拼图 多连块是指由多个等大正方形边与边连接而成的平面连通图形。 维基百科 给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成。小多连块只 能平移,不能...
  • NBUT 1105多连块拼图 Time Limit:1000MSMemory Limit:65535KB64bit IO Format: Practice Appoint description: System Crawler (Aug 12, 2016 9:32:14 AM) Description 多连块是指由多个等大正方形...
  • 多连块拼图 时间限制:1000ms | 内存限制:65535KB 难度:4 描写叙述 多连块是指由多个等大正方形边与边连接而成的平面连通图形。 ————维基百科 给一个大多连块和小多连块,你的任务是推断...
  • 多连块拼图 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述  多连块是指由多个等大正方形边与边连接而成的平面连通图形。 ———— 维基百科   给一个大多连块和小多连块,你的...
  • 南阳oj题目地址:... 多连块拼图 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述  多连块是指由多个等大正方形边与边连接而成的平面连通图形。 ———— 维基百科   给一个大多连块
  • http://acm.hust.edu.cn/vjudge/contest/view.action?cid=30744#problem/C ...多连块拼图 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u Submit Status Practice NBUT 11
  • 多连块(c++ 模拟法)

    千次阅读 2016-05-12 20:12:49
    中间那幅图的问题在于其中一个小多连块旋转了,而右图更离谱:拼在一起的那两个多连块根本就不是那个给定的小多连块(给定的小多连块画在右下方)。 Input 输入最多包含20组测试数据。每组...
  • 这道题做的真的是心碎了,虽然最后也没有靠自己的代码AC,还是靠着别人的代码AC的 真的是太菜了 附上AC代码,(不是我自己写的)#include #include ...void get_big()//获得大多连块的第一个‘*
  • 虚拟出多块无线网卡从而达到同时连接个AP MSRMesh-VirtualWIFI
  • 一直好奇操作系统如何选择网卡。  查看路由表、ARP(Address resolution Protocol地址解析协议)和路径优先级。Windows使用route print,Linux使用route命令。操作系统会对自动路由信息定时更新,将网卡数据包往返...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,893
精华内容 2,357
热门标签
关键字:

多连块