• 循环比赛


    【NOIP2015T】 跳石头

     问题描述
    设有n个选手进行循环比赛,其中n = 2m,要求每名选手要与其他n-1名选手都赛一次,每名选手每天比赛一次,循环赛共进行n - 1天,要求每天没有选手轮空。

    输入格式
    一个正整数m(2 <= n <= 6)

     输出格式

    样例形式的比赛安排表

    样例输入:

    3

    样例输出:

    1 2 3 4 5 6 7 8

    2 1 4 3 6 5 8 7

    4 3 2 1 8 7 6 5

    5 6 7 8 1 2 3 4

    6 5 8 7 2 1 4 3

    7 8 5 6 3 4 1 2

    8 7 6 5 4 3 2 1

    思索与实现:

    起初是看不大懂样例的,后来水哲告诉我看懂样例就能做出来了。我约莫看懂样例表述的含义后,恍然发现算法其实和他的含义没有任蛤关系。

    这个图事实上是中心对称。并且每一个子方块都满足中心对称,由此可以填出一半复制出另一半。并且,在结构上右侧的正方形与左侧在相对结构上是完全相同的(每个位置+a)。

    那么只要每次拓展出右侧矩阵,在中心对称即可。话说题目给了2^n似乎在暗示两分处理。

    Code:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int n, m;
    int match[110][110];
    int mid = 1, k = 1;
    
    int main(){
    	freopen("match.in","r",stdin);
    	freopen("match.out","w",stdout);
    	cin >> m;
    	n = 1 << m;
    	match[1][1] = 1;
    	do {
    		for (int i = 1; i <= mid; i++)
    			for (int j = 1; j <= mid; j++) {
    				match[i][j + mid] = match[i][j] + mid;
    			}
    		for (int i = 1; i <= mid; i++)
    			for (int j = 1; j <= mid; j++) {
    				match[i + mid][j] = match[i][j + mid];
    				match[i + mid][j + mid] = match[i][j];
    			}
    		k ++;
    		mid *= 2;
    	}
    	while (k <= m);
    	for (int i = 1; i <= n; i++) {
    		for (int j = 1; j <= n; j++)
    			cout << match[i][j] << " ";
    			cout << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    java 8 , merge()
    2026 11 12
    koda java
    Linq实现between拓展
    WinForm开发----关闭window窗体最好的办法
    ASP.NET中指定自定义HTTP响应标头
    使用Zxing.net实现asp.net mvc二维码功能
    实现asp.net mvc页面二级缓存,提高访问性能
    队列应用
    Ubuntu 12.04使用uginx+fastcgi-mono-server2部署asp.net 网站
  • 原文地址:https://www.cnblogs.com/sun915/p/9614696.html
Copyright © 2020-2023  润新知