当前位置: 首页 > ds >正文

HDU7321-KongMingQi孔明棋(找规律)

题意:给你规定初始状态有n*m个棋子,放到(n+2)*(m+2)的矩阵棋盘上,除了四条外边,其余各放一枚棋子。孔明棋在棋盘内移动一颗棋子的必要条件是:棋子的起点和终点之间有且仅有一个格子,并且格子上必须有一颗棋子,终点没有棋子,图示如下。问最后最少能剩多少棋子。

思路:先看懂下图的转换过程:

 

可以发现图4比图1少了个1x3的小矩阵,可以用上述操作在这三列上消去很多1x3矩阵。若操作到这三列只剩一个2x3的小矩阵,可以从上述图3转到下面操作,将两排同时消去:

可以看出这两种操作的条件都是要行数大于1并且由于第二种操作需要借助最左边一列辅助,所以列数要大于等于4。所以我们可以得出个小结论:若矩阵行数大于1、列数大于等于4,就可以消去三列,也就是if(n>1&&m>=4): n*m\rightarrow n*(m-3)重复这个操作就可以将矩阵列数变到4以内。由于此题行列等价n*m\rightarrow m*n,所以重复此操作可以将n和m都缩小到小于4的范围。n或者m等于1的情况可以直接计算。其余只剩2*2,2*3,3*3的情况,可以手动模拟得出结果。

#include<bits/stdc++.h>
using namespace std;int main()
{int T;cin >> T;while (T--){int n, m;cin >> n >> m;//1特判就行了 if (n == 1){cout << (m + 1) / 2 << endl;continue;}if (m == 1){cout << (n + 1) / 2 << endl;continue;}while (n >= 4){n -= 3;}while (m >= 4){m -= 3;}//减完若又出现1 if (n == 1){cout << (m + 1) / 2 << endl;continue;}if (m == 1){cout << (n + 1) / 2 << endl;continue;}//3种情况直接得出答案 if (n + m == 4)//2*2{cout << 1 << endl;}else if(n+m==5)//2*3或者3*2 {cout << 2 << endl;}else if (n + m == 6)//3*3{cout << 2 << endl;}}return 0;
}

http://www.xdnf.cn/news/11586.html

相关文章:

  • SetTimer和KillTimer函数简介
  • 【网络安全】简单的免杀方法(非常详细)零基础入门到精通,收藏这一篇就够了_免杀加壳工具
  • 收藏的 让你明白response.sendRedirect()与request.getRequestDispatcher
  • 一次对asp+fck的简单渗透
  • 瀑布流布局 (初版)
  • Windows7系统rdpclip.exe文件丢失问题
  • android原生开发教程,安卓开发入门到精通
  • 【转】Qt4移植Qt5总结
  • 编译,移植DDWRT到到belkin8230
  • 自学编程的六种方法,你必须知道
  • Windows下安装UCenter和UCenter_Home
  • 【收藏】The top 200 sites on the web
  • FPGA驱动HDMI————基于达芬奇开发板
  • oracle的常用函数
  • LED灯珠的封装形式
  • XDC约束技巧——时钟篇【XDC其基础语法来源于业界统一的约束规范SDC】
  • Java线程池ThreadPoolExecutor详细介绍与使用
  • 使用html+css+js实现一个静态页面(含源码)
  • Resultset获取数据
  • Linpack的安装
  • LaTex实战笔记 4-字体格式
  • TOPSIS法
  • 黑客常用10大工具,你用过几个?
  • 计算机中的位,字节,字,字长的定义
  • 100部经典漫画,有机会看看。
  • Linux命令su、sudo、sudo su、sudo -i使用和区别_sudu -i
  • ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
  • securecrt破解版64位
  • DeviceIoControl接口
  • MANIFEST.MF文件详解