NPSC補完計劃

登入註冊帳號.

請輸入帳號, 密碼以及預計登入時間
進階搜尋  

最新消息:

歡迎光臨NPSC補完計劃

+ NPSC補完計劃 » NPSC國中組 » NPSC2012國中組決賽
 G、蚯蚓的卡片

作者 主題: G、蚯蚓的卡片  (閱讀 1247 次)

joe59491

  • 初級會員
  • **
  • 文章數: 30
  • qazwsxedcrfvtg14
    • 檢視個人資料
G、蚯蚓的卡片
« 於: 十二月 08, 2012, 10:14:26 pm »

這題我覺得根本是在找bug花了一大堆時間...(換行和空格就夠麻煩了...)
我的解法是開個大陣列,從中間開始填,填完後再填空白。
代碼: [選擇]
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<sstream>
using namespace std;
char map[1000][1000];
char s[10000];
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%s",s);
        memset(map,0,sizeof(map));
        int len=strlen(s),x=500,y=500,v=4;//1 right , 2 left , 3 up , 4 down
        for(int i=0;i<len;i++){
            map[y][x]=s[i];
            if(v==1){
                if(map[y-1][x]==0)v=3,y--;
                else x++;
                }
            else if(v==2){
                if(map[y+1][x]==0)v=4,y++;
                else x--;
                }
            else if(v==3){
                if(map[y][x-1]==0)v=2,x--;
                else y--;
                }
            else if(v==4){
                if(map[y][x+1]==0)v=1,x++;
                else y++;
                }
            }
        int sx=500,sy=500,ex=500,ey=500;
        for(int i=0;i<1000;i++){
            for(int j=0;j<1000;j++){
                if(map[i][j]!=0){
                    if(i<sx){sx=i;}
                    if(i>ex){ex=i;}
                    if(j<sy){sy=j;}
                    if(j>ey){ey=j;}
                    }
                }
            }
        for(int i=sx;i<=ex;i++){
            for(int j=sy;j<ey;j++){
                if(map[i][j]=='\0'){
                    map[i][j]=' ';
                    }
                else break;
                }
            }
        for(int i=sx;i<=ex;i++){
            printf("%s\n",map[i]+sy);
            }
        puts("");
        }
    return 0;
    }
記錄
(\ (\
(^_^) --by joe59491

darry140

  • 初級會員
  • **
  • 文章數: 24
    • 檢視個人資料
Re: G、蚯蚓的卡片
« 回覆 #1 於: 三月 14, 2013, 02:14:15 am »

我的方法是 先把大陣列全部設空白 然後判斷每一行頭尾 然後統一把「頭」設成最前面那一個 輸出到每一行的「尾」
代碼: [選擇]
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char card[100][100];
char in[5010];
int st[100],ed[100];
void convert();
void Print();
int main()
{
//freopen("pg.in","r",stdin);
//freopen("out.txt","w",stdout);
int T;
cin>>T;
while (T--)
{
scanf("%s",in);
memset(card,' ',sizeof(char)*100*100);
convert();
Print();
cout<<endl;
}
return 0;
}
void Print()
{
memset(st,-1,sizeof(int)*100);
memset(ed,-1,sizeof(int)*100);
bool f;
for (int i=0;i<100;i++)
{
f=false;
for (int j=0;j<100;j++)
{
if (card[i][j]==' '&&f==true)
{
ed[i]=j;
break;
}
if (card[i][j]!=' '&&f==false)
{
f=true;
st[i]=j;
}
}
}
int min=99;
for (int i=0;i<100;i++)
if (min>st[i]&&st[i]>0)
min=st[i];
for (int i=0;i<100;i++)
if(st[i]>0)
st[i]=min;
for (int i=0;i<100;i++)
{
if(st[i]<0||ed[i]<0)
continue;
for (int j=st[i];j<ed[i];j++)
cout<<card[i][j];
cout<<endl;
}
return;
}
void convert()
{
//1 ↓
//2 →
//3 ↑
//4 ←
int x=50,y=50,mode=1,len=strlen(in);
for (int i=0;i<len;i++)
{
switch(mode)
{
case 1:
card[x][y]=in[i];
if(card[x][y+1]==' ')
{
y++;
mode=2;
}
else
x++;
break;
case 2:
card[x][y]=in[i];
if(card[x-1][y]==' ')
{
x--;
mode=3;
}
else
y++;
break;
case 3:
card[x][y]=in[i];
if(card[x][y-1]==' ')
{
y--;
mode=4;
}
else
x--;
break;
case 4:
card[x][y]=in[i];
if(card[x+1][y]==' ')
{
x++;
mode=1;
}
else
y--;
break;
default:
break;
}
}
return;
}
記錄
+ NPSC補完計劃 » NPSC國中組 » NPSC2012國中組決賽
 G、蚯蚓的卡片