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

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

[複製鏈接]

該用戶從未簽到

5

主題

10

帖子

92

積分

高一新生

Rank: 2

積分
92

台南一中資訊社

樓主
發表於 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
回復 支持 反對

使用道具 檢舉

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

本版積分規則

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