POJ1013假币问题--枚举

POJ1013 假币问题 枚举 暴力

题干:一共十二枚银币,一枚假的,注意就一枚是假的,假币重量与真币不同。通过三次称重来判别真假硬币,并判断比真的轻还是重,测量结果,up,down,even分别表示右盘轻了,右盘重了,平衡。硬币用A~L表示;
解题思路:枚举假设硬币是轻的,看是否符合每一个测量结果,符合这枚硬币就是假硬币,轻;否则假设硬币是重的,看是否符合每一个测量结果,把所有的硬币测量一边,即可以找到结果

在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char L[3][7];		//三组左盘硬币 
char R[3][7];		//三组右盘硬币 
char result[3][7];//三组结果

bool isfake(char c,bool light)  //枚举假设每个硬币都是轻的  指状态为up 即右边轻 
{
	for(int i=0;i<3;i++)
	{
		char *pleft,*pright;
		if(light) //右边轻 
		{
			pleft=L[i];    
			pright=R[i];
		}
		else //当左边轻的时候  交换两个盘  
		{ 
			pleft=R[i]; 
			pright=L[i];
		}
		switch(result[i][0])  //检查输入结果   
		{
			case'u':if(strchr(pright,c)==NULL) return false; //up即对应右边轻,右边有 break  否则 false 
					break;
			case'e':if(strchr(pleft,c)|| strchr(pright,c)) return false;// 只要是有 他就不是假币,false 否则break 
					break;
			case'd': if(strchr(pleft,c)==NULL) return false;// 找到 break 否则false 
					break;
		}
	}
	return true; //只有在up或down中找到了这枚硬币,并在even中没有  return true; 
}
int main()
{
	int t;
	cin>>t;				
	while(t--)
	{
		for(int i=0;i<3;i++)
			cin>>L[i]>>R[i]>>result[i];
		for(char c='A';c<='L';c++) //遍历每一枚硬币 
		{
			if(isfake(c,true)) //假设硬币轻了 
			{
				cout<<c<<" is the counterfeit coin and it is light.\n";
				break;
			}
			else if(isfake(c,false))//假设硬币重了 
			{
				cout<<c<<" is the counterfeit coin and it is heavy.\n";
				break;
			}
			
		}

	}
	
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以得知这是一道关于迷宫问题的题目,需要使用Java语言进行编写。具体来说,这道题目需要实现一个迷宫的搜索算法,找到从起点到终点的最短路径。可以使用广度优先搜索或者深度优先搜索算法来解决这个问题。 下面是一个使用广度优先搜索算法的Java代码示例: ```java import java.util.*; public class Main { static int[][] maze = new int[5][5]; // 迷宫地图 static int[][] dir = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; // 方向数组 static boolean[][] vis = new boolean[5][5]; // 标记数组 static int[][] pre = new int[5][5]; // 记录路径 public static void main(String[] args) { Scanner sc = new Scanner(System.in); for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { maze[i][j] = sc.nextInt(); } } bfs(0, 0); Stack<Integer> stack = new Stack<>(); int x = 4, y = 4; while (x != 0 || y != 0) { stack.push(x * 5 + y); int t = pre[x][y]; x = t / 5; y = t % 5; } stack.push(0); while (!stack.empty()) { System.out.print(stack.pop() + " "); } } static void bfs(int x, int y) { Queue<Integer> qx = new LinkedList<>(); Queue<Integer> qy = new LinkedList<>(); qx.offer(x); qy.offer(y); vis[x][y] = true; while (!qx.isEmpty()) { int tx = qx.poll(); int ty = qy.poll(); if (tx == 4 && ty == 4) { return; } for (int i = 0; i < 4; i++) { int nx = tx + dir[i][0]; int ny = ty + dir[i][1]; if (nx >= 0 && nx < 5 && ny >= 0 && ny < 5 && maze[nx][ny] == 0 && !vis[nx][ny]) { vis[nx][ny] = true; pre[nx][ny] = tx * 5 + ty; qx.offer(nx); qy.offer(ny); } } } } } ``` 该代码使用了广度优先搜索算法,首先读入迷宫地图,然后从起点开始进行搜索,直到找到终点为止。在搜索的过程中,使用标记数组记录已经访问过的位置,使用路径数组记录路径。最后,使用栈来输出路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值