版权声明:转载请注明出处,谢谢。 https://blog.csdn.net/Mercury_Lc/article/details/86604431
题意:给你一个4 × 4 的方格,然后给你一些1 × 2 或者 2 × 1的小方格,当这些方格在一行或者一列的时候会消除掉,问最佳放置位置。
思路:QAQ,什么时候思维会变强一些。选定一些地方,只放这几个地方就可以了。两个 flag ,分别是放置行和列的标记,如果没放之前,假设先来到是竖的, 所以先放到上面位置 [ 1 , 4 ],如果再来一个竖的,那么就可以放到下面消掉了,即位置是 [ 3, 4 ]。如果来的不是竖的,而是横的,我们可以放到 [ 4 , 1 ] 或者 [ 4 , 3 ],为了防止后来的第三个可能是竖的,如果放在 [ 4 , 3 ] 没法消掉,所以先放到前面就可以避免了。
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
char s[2000];
int main()
{
while(~scanf("%s", s))
{
int len = strlen(s);
bool h,l;
h = false;
l = false;
for(int i = 0; i < len; i ++)
{
if(s[i] == '0')
{
if(l)
{
printf("3 4\n");
l = false;
}
else
{
printf("1 4\n");
l = true;
}
}
else if(s[i] == '1')
{
if(h)
{
printf("4 3\n");
h = false;
}
else
{
printf("4 1\n");
h = true;
}
}
}
}
return 0;
}
栈模拟。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[200000];
int main()
{
while(~scanf("%s", s)){
int i = 0;
int j = 1;
int pos = 1;
bool flag = false;
int len = strlen(s);
stack<char>st;
while(1){
flag = false;
for(i = 0 ; i < len; i ++){
if(st.empty()){
st.push(s[i]);
}
else {
if(s[i] == st.top()){
pos = -pos;
st.pop();
flag = true;
}
else {
st.push(s[i]);
}
}
}
for(len = 0;!st.empty(); len ++){
s[len] = st.top();
st.pop();
}
if(!flag) break;
}
if(pos == 1)printf("No\n");
else printf("Yes\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n;
while(scanf("%d", &n) != EOF){
printf("%d\n",n);
for(int i = 0; i < n - 1; i ++)printf("1 ");
printf("1\n");
}
return 0;
}