ID
Origin
Title
454 / 1008 Problem A POJ 1321 棋盘问题
  328 / 854 Problem B POJ 2251 Dungeon Master
335 / 1101 Problem C POJ 3278 Catch That Cow
  161 / 503 Problem D POJ 3279 Fliptile
247 / 526 Problem E POJ 1426 Find The Multiple
205 / 330 Problem F POJ 3126 Prime Path
  143 / 305 Problem G POJ 3087 Shuffle'm Up
  129 / 347 Problem H POJ 3414 Pots
  141 / 463 Problem I FZU 2150 Fire Game
  134 / 710 Problem J UVA 11624 Fire!
  255 / 399 Problem K POJ 3984 迷宫问题
  196 / 276 Problem L HDU 1241 Oil Deposits
177 / 408 Problem M HDU 1495 非常可乐
  182 / 577 Problem N HDU 2612 Find a way
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

454 / 1008 Problem A POJ 1321 棋盘问题

d.在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

s.dfs

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. char cb[][];//棋盘
  6. int col[];//标记当前列是否有棋子
  7. int ans,n,k;//ans 记录方案总数
  8.  
  9. void dfs(int row,int sum){//行,已放置的总数
  10. if(sum==k){//已摆放的棋子总数 等于 k
  11. ans++;
  12. return;
  13. }
  14. int i,j;
  15. for(i=row;i<n;i++){//遍历行,从没有放置棋子的row行开始遍历
  16. for(j=;j<n;j++){//遍历列,从第一列开始遍历
  17. if(cb[i][j]=='#'&&!col[j]){//棋盘区域,并且当前列没有棋子
  18. col[j]=;
  19. dfs(i+,sum+);//在下一行中寻找放置棋子的位置
  20. col[j]=;//取消标记
  21. }
  22. }
  23. }
  24. }
  25. int main(){
  26. int i;
  27. while(~scanf("%d%d",&n,&k)){
  28. if(n==-&&k==-)break;
  29. ans=;//方案总数
  30. memset(col,,sizeof(col));//标记初始化
  31. memset(cb,'\0',sizeof(cb));//棋盘初始化
  32. for(i=;i<n;i++)scanf("%s",cb[i]);
  33. dfs(,);//0行,已放置总数0个
  34. printf("%d\n",ans);
  35. }
  36. return ;
  37. }

328 / 854 Problem B POJ 2251 Dungeon Master

335 / 1101 Problem C POJ 3278 Catch That Cow

d.起始位置N,目标位置K。

3种操作,当前+1、当前-1、当前*2

s.bfs

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<queue>
  5. using namespace std;
  6. const int Ma=;
  7. bool vis[Ma+];//标记访问
  8. int ti[Ma+];//记录时间
  9. int n,k;//农夫、牛的位置
  10.  
  11. void bfs(){//广搜
  12. int i,now,temp;
  13. queue<int>q;
  14. memset(ti,,sizeof(ti));
  15. memset(vis,false,sizeof(vis));//初始化都未被访问
  16. q.push(n);//初始位置入队
  17. vis[n]=true;
  18. while(!q.empty()){
  19. now=q.front();
  20. q.pop();
  21. if(now==k){//判断在这,如果抓到牛了
  22. printf("%d\n",ti[k]);
  23. return;
  24. }
  25. for(i=;i<=;i++){//枚举下一步的三种移动方案,x-1、x+1、2*x
  26. switch(i){
  27. case :temp=now-;break;
  28. case :temp=now+;break;
  29. case :temp=now+now;break;
  30. }
  31. if(!vis[temp]&&temp>=&&temp<=Ma){//当前位置未被访问,且位置合法
  32. vis[temp]=;//标记访问
  33. ti[temp]=ti[now]+;//时间=当前位置时间+1
  34. q.push(temp);//位置入队
  35. }
  36. }
  37. }
  38.  
  39. }
  40. int main(){
  41. while(~scanf("%d%d",&n,&k)){
  42. bfs();
  43. }
  44. return ;
  45. }

161 / 503 Problem D POJ 3279 Fliptile

247 / 526 Problem E POJ 1426 Find The Multiple

d.给出n,求一个n的倍数,这个倍数只含0或1

s.bfs

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<queue>
  4. using namespace std;
  5.  
  6. int main(){
  7. __int64 t,t2;
  8. int n,i;
  9. while(~scanf("%d",&n)&&n!=){
  10. queue<__int64>q;//队列定义在循环内,每次就不用清空了
  11. q.push();//首位必须为1
  12. while(!q.empty()){
  13. t=q.front();
  14. q.pop();
  15. if(t%n==){//找到了倍数,输出
  16. printf("%I64d\n",t);break;
  17. }
  18. for(i=;i<=;i++){// 每次最后一位 加个0 或者 加个1
  19. t2=t*+i;
  20. q.push(t2);
  21. }
  22. }
  23. }
  24. return ;
  25. }

205 / 330 Problem F POJ 3126 Prime Path

d.一个4位的素数到另外一个4位的素数,每次只能改变一位,改变后也必须是素数,求最少需要的步数。

s.bfs

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<queue>
  5. #include<math.h>
  6. using namespace std;
  7.  
  8. const int Ma=;//覆盖所有的四位数
  9. bool mark[Ma];//标记素数
  10. int s[Ma];//记录步数
  11. bool f[Ma];//标记访问
  12. void sieve_prime(){//素数筛法
  13. memset(mark,true,sizeof(mark));
  14. mark[]=mark[]=false;
  15. int k=sqrt(Ma),i,j;
  16. for(i=;i<k;i++)
  17. if(mark[i])
  18. for(j=i*i;j<Ma;j+=i)
  19. mark[j]=false;
  20. }
  21. int change(int x,int i,int j){//x的第i位数字 变为j
  22. if(i==)return j*+(x%);//依次改变1-4位的数字
  23. if(i==)return (x/)*+j*+x%;
  24. if(i==)return (x/)*+j*+x%;
  25. if(i==)return (x/)*+j;
  26. }
  27. int main(){
  28. sieve_prime();//先求出素数
  29. int t,x,y,ans,now,temp,i,j,flag;//
  30. scanf("%d",&t);//测试用例
  31. while(t--){
  32. memset(f,false,sizeof(f));//初始未访问
  33. ans=-;
  34. flag=;//标记是否找到路径
  35. scanf("%d%d",&x,&y);//起点 和终点
  36. queue<int>q;//队列定义在循环内,不用每次用的时候清空了
  37. q.push(x);//x入队
  38. now=s[x]=;//初始当前步数、x的步数 为0
  39. f[x]=true;//x标记为访问
  40. while(!q.empty()){
  41. now=q.front();
  42. q.pop();
  43. if(now==y){//如果到达终点
  44. flag=;//标记找到路径
  45. break;//退出循环
  46. }
  47. for(i=;i<=;i++){//第几位
  48. for(j=;j<=;j++){//变成几
  49. if(!(j==&&i==)){//首位不能变为0
  50. temp=change(now,i,j);
  51. if(!mark[temp]||f[temp])continue;//不是素数,或已经访问过
  52. s[temp]=s[now]+;//下个位置的步数为 当前步数+1
  53. f[temp]=true;//标记temp为访问
  54. q.push(temp);//temp 入队
  55. }
  56. }
  57. }
  58. }
  59. if(flag)printf("%d\n",s[y]);
  60. else printf("Impossible\n");
  61. }
  62. return ;
  63. }

143 / 305 Problem G POJ 3087 Shuffle'm Up
129 / 347 Problem H POJ 3414 Pots
141 / 463 Problem I FZU 2150 Fire Game
134 / 710 Problem J UVA 11624 Fire!
255 / 399 Problem K POJ 3984 迷宫问题
196 / 276 Problem L HDU 1241 Oil Deposits

177 / 408 Problem M HDU 1495 非常可乐

d. S 可乐的体积 , N 和 M是两个杯子的容量。这三个容器可以来回倒,求平分可乐的最少次数。

s.bfs

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<queue>
  5. using namespace std;
  6. int vist[][][],a,b,c;//a b c->S 可乐的体积 , N 和 M是两个杯子的容量
  7. struct node
  8. {
  9. int a,b,c;//分别表示可乐瓶子,杯子1,杯子2它们里面的可乐体积
  10. int step;//步数
  11. };
  12. int sum=;
  13. void bfs()
  14. {
  15. queue<node>q;
  16. memset(vist,,sizeof(vist));
  17. node p1;
  18. p1.a=a;
  19. p1.b=;
  20. p1.c=;
  21. p1.step=;
  22. q.push(p1);
  23. vist[p1.a][][]=;
  24. while(!q.empty())
  25. {
  26. p1=q.front();
  27. q.pop();
  28. if((p1.a==a/&&p1.b==a/)||(p1.a==a/&&p1.c==a/)||(p1.b==a/&&p1.c==a/))
  29. {
  30. printf("%d\n",p1.step);
  31. return;
  32. }
  33. //
  34. node p2;
  35. if(p1.a!=)
  36. {//a倒入b
  37. if(p1.a>b-p1.b)
  38. {
  39. p2.a=p1.a-(b-p1.b);
  40. p2.b=b;
  41. p2.c=p1.c;
  42. p2.step=p1.step+;
  43. }
  44. else
  45. {
  46. p2.a=;
  47. p2.b=p1.b+p1.a;
  48. p2.c=p1.c;
  49. p2.step=p1.step+;
  50. }
  51. if(!vist[p2.a][p2.b][p2.c])
  52. {
  53. vist[p2.a][p2.b][p2.c]=;
  54. q.push(p2);
  55. }
  56. }
  57.  
  58. if(p1.a!=)
  59. {//a倒入c
  60. if(p1.a>c-p1.c)
  61. {
  62. p2.a=p1.a-(c-p1.c);
  63. p2.b=p1.b;
  64. p2.c=c;
  65. p2.step=p1.step+;
  66. }
  67. else
  68. {
  69. p2.a=;
  70. p2.b=p1.b;
  71. p2.c=p1.c+p1.a;
  72. p2.step=p1.step+;
  73. }
  74. if(!vist[p2.a][p2.b][p2.c])
  75. {
  76. vist[p2.a][p2.b][p2.c]=;
  77. q.push(p2);
  78. }
  79. }
  80.  
  81. if(p1.b!=)
  82. {//b倒入a
  83. if(p1.b>a-p1.a)
  84. {
  85. p2.b=p1.b-(a-p1.a);
  86. p2.a=a;
  87. p2.c=p1.c;
  88. p2.step=p1.step+;
  89. }
  90. else
  91. {
  92. p2.b=;
  93. p2.a=p1.a+p1.b;
  94. p2.c=p1.c;
  95. p2.step=p1.step+;
  96. }
  97. if(!vist[p2.a][p2.b][p2.c])
  98. {
  99. vist[p2.a][p2.b][p2.c]=;
  100. q.push(p2);
  101. }
  102. }
  103.  
  104. if(p1.b!=)
  105. {//b倒入c
  106. if(p1.b>c-p1.c)
  107. {
  108. p2.b=p1.b-(c-p1.c);
  109. p2.a=p1.a;
  110. p2.c=c;
  111. p2.step=p1.step+;
  112. }
  113. else
  114. {
  115. p2.b=;
  116. p2.a=p1.a;
  117. p2.c=p1.c+p1.b;
  118. p2.step=p1.step+;
  119. }
  120. if(!vist[p2.a][p2.b][p2.c])
  121. {
  122. vist[p2.a][p2.b][p2.c]=;
  123. q.push(p2);
  124. }
  125. }
  126.  
  127. if(p1.c!=)
  128. {//c倒入a
  129. if(p1.c>a-p1.a)
  130. {
  131. p2.c=p1.c-(a-p1.a);
  132. p2.a=a;
  133. p2.b=p1.b;
  134. p2.step=p1.step+;
  135. }
  136. else
  137. {
  138. p2.c=;
  139. p2.a=p1.a+p1.c;
  140. p2.b=p1.b;
  141. p2.step=p1.step+;
  142. }
  143. if(!vist[p2.a][p2.b][p2.c])
  144. {
  145. vist[p2.a][p2.b][p2.c]=;
  146. q.push(p2);
  147. }
  148. }
  149.  
  150. if(p1.c!=)
  151. {//c倒入b
  152. if(p1.c>b-p1.b)
  153. {
  154. p2.c=p1.c-(b-p1.b);
  155. p2.a=p1.a;
  156. p2.b=b;
  157. p2.step=p1.step+;
  158. }
  159. else
  160. {
  161. p2.c=;
  162. p2.a=p1.a;
  163. p2.b=p1.b+p1.c;
  164. p2.step=p1.step+;
  165. }
  166. if(!vist[p2.a][p2.b][p2.c])
  167. {
  168. vist[p2.a][p2.b][p2.c]=;
  169. q.push(p2);
  170. }
  171. }
  172. }
  173. printf("NO\n");
  174. }
  175. int main()
  176. {
  177. while(~scanf("%d%d%d",&a,&b,&c))
  178. {
  179.  
  180. if(a==&&b==&&c==){
  181. break;
  182. }
  183.  
  184. if(a%==)
  185. {
  186. printf("NO\n");
  187. continue;
  188. }
  189.  
  190. bfs();
  191. }
  192. return ;
  193. }

182 / 577 Problem N HDU 2612 Find a way

[kuangbin带你飞]专题一 简单搜索的更多相关文章

  1. [kuangbin带你飞]专题一 简单搜索 题解报告

    又重头开始刷kuangbin,有些题用了和以前不一样的思路解决.全部题解如下 点击每道题的标题即可跳转至VJ题目页面. A-棋盘问题 棋子不能摆在相同行和相同列,所以我们可以依此枚举每一行,然后标记每 ...

  2. [kuangbin带你飞]专题一 简单搜索(回顾)

    A - 棋盘问题 POJ - 1321 注意条件:不能每放一个棋子,就标记一行和一列,我们直接枚举每一行就可以了. AC代码: #include<iostream> #include< ...

  3. [kuangbin带你飞]专题一 简单搜索 - E - Find The Multiple

    //Memory Time //2236K 32MS #include<iostream> using namespace std; ]; //保存每次mod n的余数 //由于198的余 ...

  4. [kuangbin带你飞]专题一 简单搜索 棋盘问题

    题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...

  5. [kuangbin带你飞]专题一 简单搜索 回顾总结

    第二题:bfs,忘了将queue清空. 第三题:bfs,记得使用vis数组,防止重复入队

  6. 迷宫问题 POJ - 3984 [kuangbin带你飞]专题一 简单搜索

    定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...

  7. [kuangbin带你飞]专题一 简单搜索 Find a way HDU - 2612

    Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year ...

  8. Catch That Cow POJ - 3278 [kuangbin带你飞]专题一 简单搜索

    Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. ...

  9. Dungeon Master POJ - 2251 [kuangbin带你飞]专题一 简单搜索

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

随机推荐

  1. mysql将字符转换成数字

    在操作mysql时,经常需要将字符转换成数字,这一步虽然简单,但不常用的话也很容易忘记,现将在网上找到的方法记录如下: 1.将字符的数字转成数字,比如'0'转成0可以直接用加法来实现例如:将pony表 ...

  2. jquery事件切换hover/toggle

    1.hover([over,]out) 一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法.这是一个自定义的方法,它为频繁使用的任务提供了一种“保持在其中”的状态. 当鼠标移动到一个匹配的 ...

  3. HTML 打印 javascript连续打印 分页

    page-break-after属性介绍:http://www.w3school.com.cn/cssref/pr_print_page-break-after.asp <div style=& ...

  4. maven 常见错误解决

    1. maven打包编译时后台一直输出警告信息 [WARNING] File encoding has not been set, using platform encoding GBK, i.e. ...

  5. 如何计算oracle数据库内存

    数据库内存设置: 项目 数据关系 单位 系统CPU n 个 物理内存Memory 假设4G物理内存 4*1024 MB memory_target 0.5*4*1024 0.5*Memory sga_ ...

  6. Linux dirname $0 source if

    $SHELL gives the full path to your default shell. $0 gives the name of your current shell. dirname是一 ...

  7. AngularJs初步学习笔记(part1)

    一.摘要: angular是采用JavaScript编写的前端mvc框架,帮助开发者编写现代化的单页面应用.它尤其适用编写有大量CRUD操作的,具有Ajax风格的客户端应用. 二.总结: Angula ...

  8. c# win form 显示支付宝二维码图片

    System.Net.WebClient web = new System.Net.WebClient(); byte[] buffer = web.DownloadData(网络图片的地址); we ...

  9. 剑指offer系列57---整数中1出现的次数

    [题目]求出1~n的整数中1出现的次数.(10进制) package com.exe11.offer; /** * [题目]求出1~n的整数中1出现的次数. * @author WGS * */ pu ...

  10. Avant Browser

    Avant Browser Avant 浏览器友好的用户界面为你的网络冲浪带来全新的效率和透明性.软件版本的不断升级使产品的可靠性稳步提高. 没有广告.没有恶意软件! Avant 浏览器是免费的.10 ...