九宫幻卡(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;
}