查看: 1512|回復: 2
打印 上一主題 下一主題

寒訓 01/29 基礎班 範例代碼

[複製鏈接]
  • TA的每日心情
    哭哭
    2015-5-8 16:37
  • 簽到天數: 13 天

    [LV.3]偶爾看看II

    6

    主題

    22

    帖子

    101

    積分

    高一新生

    Rank: 2

    積分
    101
    跳轉到指定樓層
    樓主
    發表於 2015-1-29 16:51:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    本帖最後由 domen111 於 2015-1-29 17:01 編輯

    [C++] 純文本查看 復制代碼
    #include <stdio.h>
    #include <algorithm>
    using std::sort;
    
    
    /*using structure*/
    struct BOOK{
            char author[200];
            char name[200];
            int year;
    };
    
    BOOK mybook[100];
    int rank[128];
    
    void init_rank(void){
            char s[29] = " .XOBCDAFGHUJKLMNIPQRSTEVWYZ";
            for(int i=0;i<28;++i){
                    rank[s[i]] = i;
                    if( s[i] >= 'A' && s[i] <= 'Z' )
                            rank[s[i]-'A'+'a'] = i;
            }
            rank[0] = -1;
    }
    int XDrz;
    
    bool string_cmp(char s1[], char s2[]){
            for(int i=0;s1[i]!=0 || s2[i]!=0;++i){
                    if( rank[s1[i]] < rank[s2[i]] )
                            return true;
                    else if( rank[s1[i]] > rank[s2[i]] )
                            return false;
            }
            return false;                
    }
    
    bool cmp(BOOK x, BOOK y){
            if( string_cmp(x.author, y.author) )
                    return true;
            else if( string_cmp(y.author, x.author) )
                    return false;
            if( x.year < y.year ) return true;
            else if( x.year > y.year ) return false;
            if( string_cmp(x.name, y.name) )
                    return true;
            else 
                    return false;        
    }
    
    int main(){
            init_rank();
            
            int n;
            char buf[30+100+4+10];
            
            gets(buf);
            sscanf( buf, "%d", &n);
                    
            for(int i=0;i<n;++i){
                    gets(buf);
                    int len = 0;
                    int j;
                    for(j=0;buf[j]!=',';++j)
                            mybook[i].author[len++] = buf[j];
                    j += 2;
                    len = 0;
                    for(;buf[j]!='(';++j)
                            mybook[i].name[len++] = buf[j];
                    j += 1;
                    char number[5];
                    for(int k=0;k<4;++k)
                            number[k] = buf[j+k];
                    number[4] = 0;
                    sscanf( number, "%d", &mybook[i].year);
            }
            sort( mybook, mybook+n, cmp);
            
            for(int i=0;i<n;++i){
                    printf("%s, %s(%d)\n", mybook[i].author, mybook[i].name, mybook[i].year);
            }
            
            return 0;
    }
    


    Zerojudge b240
    回復

    使用道具 檢舉

  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    推薦
    發表於 2015-1-31 09:37:13 | 只看該作者
    [C++] 純文本查看 復制代碼
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<cstring>
    #include<set>
    using namespace std;
    
    int map[9][9];
    int N,NN;
    bool check()
    {
    	set<int> s;
    	
    	for(int i=0;i<NN;++i)
    	{
    		//line
    		s.clear();
    		for(int j=0;j<NN;++j)
    		{
    			if( map[i][j] != 0 )
    				if( s.find( map[i][j] ) == s.end() )
    					s.insert(map[i][j]);
    				else
    					return false;
    		}
    		//row
    		s.clear();
    		for(int j=0;j<NN;++j)
    		{
    			if( map[j][i] != 0 )
    				if( s.find( map[j][i] ) == s.end() )
    					s.insert(map[j][i]);
    				else
    					return false;
    		}
    	}
    	//block
    	for(int i=0;i<N;++i)
    		for(int j=0;j<N;++j)
    		{
    			s.clear();
    			for(int k=0;k<N*N;++k)
    			{
    				int I = i*N + k/N;
    				int J = j*N + k%N;
    				if( map[I][J] != 0 )
    					if( s.find( map[I][J] ) == s.end() )
    						s.insert(map[I][J]);
    					else
    						return false;
    			}
    		}
    	return true;
    }
    bool dfs(int id)
    {
    	
    	if( id == NN*NN )
    	{
    		if( check() )
    		{
    			for(int i=0;i<NN;++i)
    			{
    				for(int j=0;j<NN;++j)
    					cout<<map[i][j]<<' ';
    				cout<<'\n';
    			}
    			return true;
    		}
    		return false;
    	}
    	int I = id/NN;
    	int J = id%NN;
    	if( map[I][J] )
    		return dfs(id+1);
    	for(int i=1;i<=NN;++i)
    	{
    		map[I][J]=i;
    		if( check() )
    			if( dfs(id+1) )
    				return true;
    		map[I][J]=0;
    	}
    	return false;
    }
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	while(cin>>N)
    	{
    		NN=N*N;
    		for(int i=0;i<NN;++i)
    		{
    			for(int j=0;j<NN;++j)
    			{
    				cin>>map[i][j];
    			}
    		}
    		if(!dfs(0))
    			cout<<"NO SOLUTION\n";
    	}
    	return 0;
    }
    
    回復 支持 1 反對 0

    使用道具 檢舉

    該用戶從未簽到

    5

    主題

    10

    帖子

    92

    積分

    高一新生

    Rank: 2

    積分
    92

    台南一中資訊社

    3#
    發表於 2015-2-2 19:04:30 | 只看該作者
    學長您好  我不曉得為甚麼我改成多冊資輸入+每輸入一回會自動更新紀錄的值,但上傳ZJ是WA,請求協助
    [C++] 純文本查看 復制代碼
    #include<iostream>
    using namespace std;
    int n,sudoku[9][9],N;
    int ok[9][9][9];
    void init_ok(void)
    {
            for(int i=0;i<9;i++)
            {
                    for(int j=0;j<9;j++)
                    {
                            for(int k=0;k<9;k++) ok[i][j][k]=0;
                    }
            }
    }
    void modify(int x,int y,int i,int w)
    {
            for(int j=0;j<N;j++)
            {
                    ok[y][j][i]+=w;
                    ok[j][x][i]+=w;
            }
            int a=(y/n)*n;
            int b=(x/n)*n;
            for(int l=a;l<a+n;l++)
            {
                    for(int m=b;m<b+n;m++)
                    {
                            ok[l][m][i]+=w;
                    }
            }
    }
    bool solve(void)
    {
            int z_min=10,x,y,a,b;
            for(int i=0;i<N;i++)
            {
                    for(int j=0;j<N;j++)
                    {
                            if(sudoku[i][j]==0) 
                            {
                                    int z=0;
                                    for(int k=0;k<N;k++)
                                    {
                                            if(ok[i][j][k]==0) z++;
                                    }
                                    if(z_min>z)
                                    {
                                            y=i;
                                            x=j;
                                            z_min=z;
                                    }
                            }
                    }
            }
            if(z_min==10) return true;
            if(z_min==0) return false;
            else
            {
                    for(int i=0;i<N;i++)
                    {
                            if(ok[y][x][i]==0)
                            {
                                    sudoku[y][x]=i+1;
                                    modify(x,y,i,1);
                                    if(solve()) return true;
                                    else
                                    {
                                            sudoku[y][x]=0;
                                            modify(x,y,i,-1);
                                    }
                            }
                    }
                    return false;
            }
    }
    int main()
    {
            while(cin>>n)
            {
                    N=n*n;
                    init_ok();
                    for(int i=0;i<N;i++)
                    {
                            for(int j=0;j<N;j++)
                            {
                                    cin>>sudoku[i][j];
                            }
                    }
                    for(int i=0;i<N;i++)
                    {
                            for(int j=0;j<N;j++)
                            {
                                    if(sudoku[i][j]!=0)
                                    {
                                            modify(j,i,sudoku[i][j]-1,1);
                                    }
                            }
                    }
                    if(solve()==false) cout<<"NO SOLUTION\n";
                    else
                    {
                            for(int i=0;i<N;i++)
                            {
                                    for(int j=0;j<N;j++) cout<<sudoku[i][j]<<' ';
                                    cout<<"\n";
                            }
                    }
            }
            return 0;
    }
    


    愛用插入代碼...

    By Sylveon
    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表