uva1588換低檔裝置Kickdown

背景:wrong得我想哭,一上午和一晚上。錯主要錯在:<1>最先循環寫成了死循環  <2>考慮問題不全面,少考慮了一個方面  <3>再寫循環的時候循環終止條件錯誤

思路:第一段代碼的思路是固定一個長的,讓短的那根長條從最開始往後移,遇到吻合的話就輸出,結束循環。

            第二段代碼的思路是先隨便固定一個字符串,並把這個字符串進行延伸,延伸方法是在這個字符串的前面和後面都添加一些0,然後還是讓另一跟木條在上面移動,遇到吻合的,就比較將小的數複製給答案,直到處理到最後面,輸出最終答案。

總結:以後再寫代碼的時候,注意以上三點需要特別注意。

以下是最開始寫出的代碼,普通情況能夠運行通過,但就是遇到特別坑的數據就通不過了,因爲此代碼少考慮了一種情況。比如說遇到數據121221212211212121112222211122和1212122121的時候就不可以正確輸出了,因爲這就是少考慮的那種情況,請讀者按照數據自行考慮一下此代碼少考慮了哪種情況。

#include <stdio.h>
#include <string.h>
void Search(int m,int n,char strip1[],char strip2[])
{
    int ans=0,temp=0;
    for(int k1=0;k1<=m;k1++)
    {
        int ok1=1,k=k1;
        for(int k2=0;k2<n&&k<m;k2++,k++)
        {
            int d=strip1[k]+strip2[k2];
            if(d>('3'+48)&&ok1) {ok1=0;break;}
        }
        if(ok1)
        {
            if(n+k1<=m) {ans=m;break;}
            else {ans=n+k1;break;}
        }
    }
    printf("%d\n",ans);
}
int main(void)
{
    char strip1[105],strip2[105];
    memset(strip1,'A',sizeof(strip1));
    memset(strip2,'A',sizeof(strip2));
    while(scanf("%s %s",strip1,strip2)==2)
    {
        int m=strlen(strip1),n=strlen(strip2);
        if(m<n) Search(n,m,strip2,strip1);
        else Search(m,n,strip1,strip2);
        memset(strip1,'A',sizeof(strip1));
        memset(strip2,'A',sizeof(strip2));
    }
    return 0;
}

上面代碼少考慮了一種情況,請讀者思考過後再來看補齊所缺的那種情況後的代碼。

#include <stdio.h>
#include <string.h>
void Search(int m,int n,char strip1[],char strip2[])
{
    int ans=0,temp=0,ok=1;
    for(int k1=0;k1<=m;k1++)
    {
        int ok1=1,k=k1,ok2=1;
        for(int k2=0;k2<n&&k<m;k2++,k++)
            if((strip1[k]+strip2[k2])>('3'+48)) {ok1=0;break;}
        if(ok1)
        {
            if(n+k1<=m) {ans=m;break;}
            else {ans=n+k1;break;}
        }
    }
    for(int i=n-1;i>=0;i--)
    {
        ok=1,temp=i;
        for(int j=n-1;j>=n-1-i;j--,temp--)
            if((strip1[temp]+strip2[j])>=100) {ok=0;break;}
        if(ok) {ans=(ans>(m+n-i-1)?(m+n-i-1):ans);break;}
    }
    printf("%d\n",ans);
}
int main(void)
{
    char strip1[105],strip2[105];
    memset(strip1,'A',sizeof(strip1));
    memset(strip2,'A',sizeof(strip2));
    while(scanf("%s %s",strip1,strip2)==2)
    {
        int m=strlen(strip1),n=strlen(strip2);
        if(m<n) Search(n,m,strip2,strip1);
        else Search(m,n,strip1,strip2);
        memset(strip1,'A',sizeof(strip1));
        memset(strip2,'A',sizeof(strip2));
    }
    return 0;
}

這裏筆者提供另外一段代碼,和上面的代碼思路大同小異,但是是從一開始就把特殊情況考慮到的,但是下面的代碼和上面的比較時間會用得多一些,但是本題數據較小,所以這點時間損失可以忽略不計。

#include <stdio.h>
#include <string.h>
int Max(int a,int b){return a>b?a:b;}
int Min(int a,int b){return a<b?a:b;}
void change(char *s1)
{
    char s[305]={'0'};
    int n=strlen(s1);
    for(int i=0;i<n;i++) s[i+1]=s1[i];
    strcpy(s1,s);
}
int main()
{
    int i,j,ok,length;
    char s1[305],s2[305],t[305];
    memset(s1,'A',sizeof(s1));
    memset(s2,'A',sizeof(s2));
    while(scanf("%s %s",s1,s2)==2)
    {
        int l1=strlen(s1),l2=strlen(s2),ans=l1+l2;
        memset(t,'0',sizeof(t));
        for(int k=l1;k<l1+l2;k++) t[k]=s2[k-l1];
		t[l1+l2+l1]='\0';
		strcpy(s2,t);
        for(i=0;i<l1+l2;i++)
        {
			int n=l1;
            for(j=0;j<strlen(s1);j++)
            {
                ok=1;
                if(s1[j]+s2[j]-2*'0'>3) {ok=0;break;}
            }
            if(ok)
            {
                length=Max(l1+l2,l1+i)-Min(i,l1);
                if(length<ans) ans=length;
            }
            change(s1);
        }
        printf("%d\n",ans);
        memset(s1,'A',sizeof(s1));
        memset(s2,'A',sizeof(s2));
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章