九宫幻卡(50分)

九宫幻卡(50分)

Description

摘自PTA。

九宫幻卡是人气MMORPG《最终幻想14》中里的一个小游戏。

在这里插入图片描述
在这里插入图片描述

模拟一下具体怎么放卡片就行。

本题问题在于怎么确定 1到9的位置信息。 因为用的定位是二维数组。

这里需要一个转换

一个九宫格的转换。把该九宫格可以改变的位置改变。以下的数组中, 0表示不可以到达,1 表示可以到达。 对于(1,1) 就是九宫格中的第一个点,则它可以到达的点只有右边和下面, {0,1,1,0}表示从上不可以经过、右可以经过、下可以经过、左不可以经过。
int a[10][4]=  //标记可以走的范围, 我的设计用一个扩大的边界解决,
//明显下面的方法更好 
{  
	{0},
	{0,1,1,0},
	{0,1,1,1},
	{0,0,1,1},
	{1,1,1,0},
	{1,1,1,1},
	{1,0,1,1},
	{1,1,0,0},
	{1,1,0,1},
	{1,0,0,1},	
};

第二点是: 每次放一张就需要重新定是先手还是后手的卡片。(每次实时判断)

#include <bits/stdc++.h>
using namespace std;
int a[10][4]={  
	{0},
	{0,1,1,0},
	{0,1,1,1},
	{0,0,1,1},
	{1,1,1,0},
	{1,1,1,1},
	{1,0,1,1},
	{1,1,0,0},
	{1,1,0,1},
	{1,0,0,1},	
};
int b[4]={-3,1,3,-1};
struct node
{
	int value[4];//up,right,down,left;
	int flag;//先手1,后手0 
	node(){};	
};

node player[2][6];
node play[10];
bool vis[10];
void change(int pos) 
{
	int adj;
	for (int i = 0 ; i<4; ++i)
	{
		if (a[pos][i] == 1  )
		{
			adj = pos+b[i];
			if (!vis[adj]) continue;
			if (play[pos].value[i] > play[adj].value[(i+2)%4])  play[adj].flag = play[pos].flag;
		} 
	}
}
 
int cmp(string s1,string s2)
{
	int cnt = 0;
	for(int i = 3 ; i>=0; --i)
	{
		if (s1[i] != s2[i]) break;
		else cnt++;
	}
	return cnt;
}
//string a[110],b[4];
int n;
int main(int argc, char *argv[]) {
	int n;
	cin>>n;
	while(n--)
	{
		memset(vis,0,sizeof(vis));
		for (int i = 1 ; i<6;++i)
			for(int j = 0;j<4;++j)
				cin>>player[1][i].value[j],player[1][i].flag = 1;
		for (int i = 1 ; i<6;++i)
			for(int j = 0;j<4;++j)
		   cin>>player[0][i].value[j],player[0][i].flag = 0;;
		for (int i = 1; i<10; ++i)
		{
			int x,y;
			cin>>x>>y;
			vis[x] = true;
			play[x] = player[i%2][y];
			change(x);			
		}
		int first = 0,second;
		for(int i = 1; i<10; ++i)
			if(play[i].flag ==1 ) ++first;
		second = 10-first;
		if (first == second) cout<<"Tie\n5:5\n";
		else if(first>second) cout<<"Win\n"<<first<<":"<<second<<endl;
		else cout<<"Lose\n"<<first<<":"<<second<<endl;
	}	
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值