// 很久以前写的,当时费了好大劲,不过很爽
#include <iostream>
#include <iomanip>
#include <stdio.h>
using namespace std;
int main()
{
int T;
int n;
int number[19][19] = {0};
int i,j;
int num = 1;
int x,y;
while (scanf("%d",&T) != EOF) {
j=0;
while (j < T) {
j++;
cin>>n;
x = 0; y = n/2; num=1; number[x][y]=num;
for (i=1; i<n*n; i++) {
num++;
if (x-1 < 0) {
x = n-1; y = y+1;
if (n==y) {
x = 1; y = n -1;
}
}
else if (n == y+1) {
x = x-1; y = 0;
if (x < 0) {
x = 1; y = n-1;
}
}
else if (number[x-1][y+1] != 0) {
x = x+1;
}
else {
x= x-1; y = y+1;
}
number[x][y] = num;
}
for (x=0; x<n; x++) {
for (y=0; y<n; y++) {
if (y < n-1) {
cout<<setw(4)<<number[x][y];
}
else {
cout<<setw(4)<<setiosflags(ios::right)<<number[x][y]<<endl;
}
}
}
for (x=0; x<n; x++) {
for (y=0; y<n; y++) {
number[x][y] = 0;
}
}
}
}
return 0;
}
题意:
判断设置的密码是否合法,和设置手机解锁图案一样的规则
1、大于等于四个点
2、不能重复
3、如果某两个的中点如果还没有被访问过,那么这两个点不能直接连接
解题思路:
注意si可能为0或大于9
//BC_75_1002,刚开始AC了,然而终测TLE
//HDU挂出来以后再拿这个代码交,竟然 842MS 过了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int vis[15];
int s[15];
int judge(int n)
{
if (s[n] == 5) {
return 0;
}
if ((s[n]+s[n+1])==10 && !vis[5]) {
return 1;
}
if (s[n]==1 && s[n+1] == 3 && !vis[2]) {
return 1;
}
if (s[n]==3 && s[n+1] == 1 && !vis[2]) {
return 1;
}
if (s[n]==7 && s[n+1] == 9 && !vis[8]) {
return 1;
}
if (s[n]==9 && s[n+1] == 7 && !vis[8]) {
return 1;
}
if (s[n]==1 && s[n+1] == 7 && !vis[4]) {
return 1;
}
if (s[n]==7 && s[n+1] == 1 && !vis[4]) {
return 1;
}
if (s[n]==9 && s[n+1] == 3 && !vis[6]) {
return 1;
}
if (s[n]==3 && s[n+1] == 9 && !vis[6]) {
return 1;
}
return 0;
}
int main()
{
// freopen("in.txt", "r", stdin);
int T;
cin>>T;
while (T--) {
memset(vis, 0, sizeof(vis));
int k;
cin>>k;
int flag = 0;
for (int i=0; i<k; ++i) {
cin>>s[i];
if (s[i] > 9 || s[i] == 0) {
flag = 1;
}
}
int Count = 0;
if (flag == 0) {
for (int i=0; i<k; ++i) {
if (vis[s[i]]) {
flag = 1;
break;
}
if (i+1 < k) {
if (judge(i)) {
flag = 1;
break;
}
}
vis[s[i]] = 1;
++Count;
}
}
if (Count < 4) {
flag = 1;
}
if (flag) {
cout<<"invalid"<<endl;
} else {
cout<<"valid"<<endl;
}
}
return 0;
}
//156MS,打表大法好
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 9 + 10;
int s[maxn];
bool vis[maxn];
int mid[maxn][maxn];
void Init(void);
int main(void)
{
// freopen("in.txt", "r", stdin);
Init();
int T;
scanf("%d", &T);
while (T--) {
memset(vis, false, sizeof(vis));
int k;
scanf("%d", &k);
for (int i=0; i<k; ++i) {
scanf("%d", &s[i]);
}
bool flag = true;
int Count = 0;
for (int i=0; i<k; ++i) {
if (s[i] == 0 || s[i] > 9) {
flag = false;
break;
}
if (!vis[s[i]]) {
++Count;
if (i > 0) {
int t = mid[s[i-1]][s[i]];
if (t != 0 && !vis[t]) {
flag = false;
break;
}
}
vis[s[i]] = true;
} else {
flag = false;
break;
}
}
if (flag && Count >= 4) {
printf("valid\n");
} else {
printf("invalid\n");
}
}
return 0;
}
void Init(void)
{
memset(mid, 0, sizeof(mid));
mid[1][3] = mid[3][1] = 2;
mid[4][6] = mid[6][4] = 5;
mid[7][9] = mid[9][7] = 8;
mid[1][7] = mid[7][1] = 4;
mid[2][8] = mid[8][2] = 5;
mid[3][9] = mid[9][3] = 6;
mid[1][9] = mid[9][1] = 5;
mid[3][7] = mid[7][3] = 5;
}
3、UVa 133 The Dole Queue
题意:
为了缩短领救济品的队伍,NNGLRP决定了以下策略:
每天所有来申请救济品的人会被放在一个大圆圈,面朝里面
选定一个人为编号 1 号,其他的就从那个人开始逆时针开始编号直到 N
一个官员一开始逆时针数,数 k 个申请者,然后另一个官员第 N 个始顺时针方向数 m 个申请者,这两个人就被送去再教育
如果两个官员数的是同一个人,那个人则被送去从政
然后2个官员再在剩下的人里面继续选直到没人剩下来
Input
输入含有多组测试数据,每组测试数据一列含有三个数 N,k 和 m(k, m > 0,0 < N < 20)。 当输入为 0 0 0 代表输入结束
Output
对每组测试资料输出一列。输出被选中的申请者的编号顺序(一对一对的)。每个数的宽度为 3
每一对前面的那个编号为逆时针数的官员选出的,后面的那个编号为顺时针数的官员选出的(但是如果这2个官员选出同一个人,那就只会有一个编号)
每一对之间以逗号分开
格式请参考Sample Output
Sample Input
10 4 3
13 17 42
7 8 47
0 0 0
Sample Output
4 8, 9 5, 3 1, 2 6, 10, 7
4 11, 10 1, 8 6, 13 7, 3, 5 12, 9 2
1 3, 5 7, 2 4, 6
解题思路:
数据规模比较小,用数组模拟一下
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e5;
int N, k, m;
int Queue[maxn];
bool vis[30];
int main()
{
// freopen("in.txt", "r", stdin);
while (scanf("%d%d%d", &N, &k, &m) != EOF && !(N == 0 && k == 0 && m == 0)) {
memset(vis, false, sizeof(vis));
for (int i=1; i<=N; ++i) {
Queue[i] = i;
}
int Count = 0;
int a_t = 1, b_t = N;
while (Count < N) {
int a = 0, b = 0;
int i = a_t;
int k_Count = 0, m_Count = 0;
while (1) {
if (!vis[Queue[i]]) {
++k_Count;
if (k_Count == k) {
a = Queue[i];
++Count;
break;
}
}
++i;
if (i > N) {
i = 1;
}
}
i = b_t;
while (1) {
if (!vis[Queue[i]]) {
++m_Count;
if (m_Count == m) {
b = Queue[i];
++Count;
break;
}
}
--i;
if (i == 0) {
i = N;
}
}
if (a == b) {
vis[a] = true;
--Count;
printf("%3d", a);
} else {
vis[a] = true;
vis[b] = true;
printf("%3d%3d", a, b);
}
if (Count != N) {
printf(",");
}
a_t = a; b_t = b;
}
printf("\n");
}
return 0;
}
4、NUC_第11届校赛_F 相对距离
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1000 + 10;
char s1[maxn];
char s2[maxn];
char t1[1000][maxn];
char t2[1000][maxn];
int main()
{
#ifdef __AiR_H
freopen("in.txt", "r", stdin);
#endif // __AiR_H
gets(s1);
gets(s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
int c1 = 0, c2 = 0;
for (int i = 0; i < len1; ++i) {
if (s1[i] == '/') {
int j = 0;
++i;
for (; s1[i] != '/' && i < len1; ++i, ++j) {
t1[c1][j] = s1[i];
}
++c1;
if (s1[i] == '/') {
--i;
}
}
}
for (int i = 0; i < len2; ++i) {
if (s2[i] == '/') {
int j = 0;
++i;
for (; s2[i] != '/' && i < len2; ++i, ++j) {
t2[c2][j] = s2[i];
}
++c2;
if (s2[i] == '/') {
--i;
}
}
}
int sum = c1 + c2;
int t = min(c1, c2);
for (int i = 0; i < t; ++i) {
if (strcmp(t1[i], t2[i]) != 0) {
break;
} else {
sum -= 2;
}
}
printf("%d\n", sum);
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
char s1[10];
char s2[10];
bool vis[10];
int main()
{
#ifdef __AiR_H
freopen("in.txt", "r", stdin);
#endif // __AiR_H
int N;
scanf("%d", &N);
int Case = 0;
while (N--) {
int c1 = 0;
bool flag = false;
memset(vis, false, sizeof(vis));
for (int i = 1; i <= 9; ++i) {
cin>>s1[i];
if (s1[i] == '1') {
++c1;
} else {
vis[i] = true;
}
}
int t = 0;
bool flag2 = true;
for (int i = 1; i <= 9; ++i) {
cin>>s2[i];
if (s2[i] == '1') {
if (!vis[i]) {
flag2 = false;
}
if (vis[i]) {
++t;
}
}
}
if (t + c1 >= 9 && flag2) {
flag = true;
}
char s_t[10];
if (!flag) {
s_t[1] = s2[7]; s_t[2] = s2[4]; s_t[3] = s2[1];
s_t[4] = s2[8]; s_t[5] = s2[5]; s_t[6] = s2[2];
s_t[7] = s2[9]; s_t[8] = s2[6]; s_t[9] = s2[3];
t = 0;
flag2 = true;
for (int i = 1; i <= 9; ++i) {
if (s_t[i] == '1') {
if (!vis[i]) {
flag2 = false;
break;
}
if (vis[i]) {
++t;
}
}
}
}
if (t + c1 >= 9 && flag2) {
flag = true;
}
if (!flag) {
s_t[1] = s2[9]; s_t[2] = s2[8]; s_t[3] = s2[7];
s_t[4] = s2[6]; s_t[5] = s2[5]; s_t[6] = s2[4];
s_t[7] = s2[3]; s_t[8] = s2[2]; s_t[9] = s2[1];
t = 0;
flag2 = true;
for (int i = 1; i <= 9; ++i) {
if (s_t[i] == '1') {
if (!vis[i]) {
flag2 = false;
break;
}
if (vis[i]) {
++t;
}
}
}
}
if (t + c1 >= 9 && flag2) {
flag = true;
}
if (!flag) {
s_t[1] = s2[3]; s_t[2] = s2[6]; s_t[3] = s2[9];
s_t[4] = s2[2]; s_t[5] = s2[5]; s_t[6] = s2[8];
s_t[7] = s2[1]; s_t[8] = s2[4]; s_t[9] = s2[7];
t = 0;
flag2 = true;
for (int i = 1; i <= 9; ++i) {
if (s_t[i] == '1') {
if (!vis[i]) {
flag2 = false;
break;
}
if (vis[i]) {
++t;
}
}
}
}
if (t + c1 >= 9 && flag2) {
flag = true;
}
++Case;
printf("case %d: ", Case);
if (flag) {
printf("YES\n");
} else {
printf("NO\n");
}
}
return 0;
}