using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Grid.RowCount = 10;
Grid.AllowUserToAddRows = false;
//чтение из файла
var names = new List<string>();
string[] lines = File.ReadAllLines(@"E:/table.txt", Encoding.Default);
for (int i = 0; i < 9; i++)
{
string[] array = lines[i].Split(';');
for (int n = 0; n < 9;n++ )
{ Grid[n, i].Value = array[n]; }
}
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
private void HorBtn_Click(object sender, EventArgs e)
{
int i, j;
int[,] vgrid = new int[9, 9];//создание массива
int[,] oldgrid = new int[9, 9];//создание старого массива
int change = 1;
for (i = 0; i < 9; ++i)//запись из таблицы в массив
for (j = 0; j < 9; ++j)
if (Grid.Rows[i].Cells[j].Value!="")
vgrid[i, j]=Convert.ToInt32(Grid.Rows[i].Cells[j].Value);
// while (change != 0)//цикл редактирования
// {
for (i = 0; i < 9; ++i)//запись из нового массива в старый
for (j = 0; j < 9; ++j)
oldgrid[i, j] = vgrid[i, j];
//начинаем редактирование
for (i = 0; i < 9; ++i) //горизонтальный прогон
{
int recx = 0;
int recy = 0;
int zeros = 0;
int sum = 0;
for (j = 0; j < 9; ++j)
{
sum = sum + vgrid[i, j];
if (vgrid[i, j] == 0)
{
zeros++;
recx = i; recy = j;
}
}
if (zeros == 1) { vgrid[recx, recy] = 45 - sum;
}
}
//////////////////////////////////////////////////
for (i = 0; i < 9; ++i) //вертикальный прогон
{
int recx = 0;
int recy = 0;
int zeros = 0;
int sum = 0;
for (j = 0; j < 9; ++j)
{
sum = sum + vgrid[j, i];
if (vgrid[j, i] == 0)
{
zeros++;
recx = j; recy = i;
}
}
if (zeros == 1) { vgrid[recx, recy] = 45 - sum;
}
}
/////////////////////////////////////
for (int x = 0; x < 3; x++)//прогон блока
for (int y = 0; y < 3; y++)
{
int recx = 0;
int recy = 0;
int zeros = 0;
int sum = 0;
for (i = 3 * x; i < 3 + 3 * x; ++i) //горизонтальный прогон
{
for (j = 3 * y; j < 3 + 3 * y; ++j)
{
sum = sum + vgrid[i, j];
if (vgrid[i, j] == 0)
{
zeros++;
recx = i; recy = j;
}
}
}
if (zeros == 1) { vgrid[recx, recy] = 45 - sum; }
}
//метод исключения
for (int x = 0; x < 3; x++)//прогон блока
for (int y = 0; y < 3; y++)
{
int zeros = 0;
int[] xblank = new int[10]; //х-координата пустой клетки
int[] yblank = new int[10]; //у-координата пустой клетки
bool[] available = new bool[10]; //доступность пустой клетки
bool[] used = new bool[10]; //использованность пустой клетки другим числом
bool present = false;
int possibleblanks = 0;
for(int a = 1; a<=9; a++)
{
available[a]=false;
used[a]=false;
}
for (i = 3 * x; i < 3 + 3 * x; ++i) //Сколько нулей, сука?
{
for (j = 3 * y; j < 3 + 3 * y; ++j)
if (vgrid[i, j] == 0)
{
zeros++;
xblank[zeros]=i;
yblank[zeros] = j;
available[zeros]=true;
}
}
//Каких цифр не хватает?
for(int n = 1; n<=9;n++)
{ present = false;
possibleblanks = 0;
for(int a = 1; a<=9; a++)
{
available[a]=true;
}
for (i = 3 * x; i < 3 + 3 * x; ++i)
{
for (j = 3 * y; j < 3 + 3 * y; ++j)
if (vgrid[i, j] == n)
{
present = true;
}
}
if(present==false)//если такой цифры нет, смотрим, можно ли подставить
{
for (int blankcount = 1; blankcount <= zeros; blankcount++)
{
if (used[blankcount] == false)//если пустая клетка не использована
{
for (int a = 0; a < 9; a++)//перекрестная проверка конфликта
{
if (vgrid[a, yblank[blankcount]] == n)
{ available[blankcount] = false; }
if (vgrid[xblank[blankcount], a] == n)
{ available[blankcount] = false; }
}
}
}
for(int a = 1; a<=zeros; a++)//считаем колво возможных клеток
{
if((available[a]==true)&&(used[a]==false)) possibleblanks++;
}
if(possibleblanks==1)
for(int a = 1; a<=9; a++)
{
if((available[a]==true)&&(used[a]==false))
{
vgrid[xblank[a], yblank[a]] = n;
used[a] = true;
}
}
}
}
}
//заканчиваем редактирование
change = 0;
for (i = 0; i < 9; ++i) //проверяем массив на новизну
for (j = 0; j < 9; ++j)
{
change = change + vgrid[i, j] - oldgrid[i, j];
}
//} //конец редактирования
for (i = 0; i < 9; ++i) //запись массива в таблицу
for (j = 0; j < 9; ++j)
Grid.Rows[i].Cells[j].Value = vgrid[i, j];
}
private void VertBtn_Click(object sender, EventArgs e)
{
var names = new List<string>();
string[] lines = File.ReadAllLines(@"E:/table.txt", Encoding.Default);
for (int i = 0; i < 9; i++)
{
string[] array = lines[i].Split(';');
for (int n = 0; n < 9; n++)
{ Grid[n, i].Value = array[n]; }
}
}
}
}